Все в заголовке; супер-простой, я считаю, но так трудно найти синтаксические вещи где-нибудь.
Это два файла библиотеки, которые я копирую из CS50.net, и мне интересно, почему у них есть два разных расширения.
Все в заголовке; супер-простой, я считаю, но так трудно найти синтаксические вещи где-нибудь.
Это два файла библиотеки, которые я копирую из CS50.net, и мне интересно, почему у них есть два разных расширения.
.c: c файл (где, вообще говоря, действительное действие)
.h: файл заголовка (для включения в директиву препроцессора #include
). Содержит вещи, которые обычно считаются разделяемыми с другими частями вашего кода, такими как прототипы функций, # define'd stuff, декларация extern для глобальных переменных (о, ужас) и т.п.
Технически вы можете поместить все в один файл. Целая программа на С. миллионов линий. Но мы, люди, склонны организовывать вещи. Таким образом, вы создаете разные файлы C, каждый из которых содержит определенные функции. Это все красиво и чисто. Затем вы вдруг осознаете, что объявление, которое вы имеете в данном файле C, должно существовать и в другом файле C. Поэтому вы их дублируете. Поэтому лучше всего извлечь декларацию и поместить ее в общий файл, который является .h
Например, в cs50.h вы найдете так называемые "форвардные декларации" ваших функций. Прямое объявление - это быстрый способ сообщить компилятору, как должна быть вызвана функция (например, какие входные параметры) и что она возвращает, поэтому она может выполнять правильную проверку (например, если вы вызываете функцию с неправильным числом параметров, это будет жаловаться).
Другой пример. Предположим, вы пишете файл .c, содержащий функцию, выполняющую регулярное выражение. Вы хотите, чтобы ваша функция принимала регулярное выражение, строку для соответствия и параметр, указывающий, должно ли сравнение быть нечувствительным к регистру.
в .c, вы должны положить
bool matches(string regexp, string s, int flags) { the code }
Теперь предположим, что вы хотите передать следующие флаги:
0: если поиск чувствителен к регистру
1: если поиск нечувствителен к регистру
И вы хотите, чтобы вы открывались для новых флагов, поэтому вы не вводили логическое значение. играть с цифрами сложно, поэтому вы определяете полезные имена для этих флагов
#define MATCH_CASE_SENSITIVE 0
#define MATCH_CASE_INSENSITIVE 1
Эта информация идет в .h, потому что, если какая-либо программа хочет использовать эти метки, она не знает их, если вы не включите эту информацию. Конечно, вы можете поместить их в .c, но тогда вам придется включить код .c(целое!), Что является пустой тратой времени и источником проблем.
Конечно, нет ничего, что говорит о том, что расширение файла заголовка должно быть .h
, а расширение исходного файла C должно быть .c
. Это полезные соглашения.
E:\Temp> type my.interface
#ifndef MY_INTERFACE_INCLUDED
#define MYBUFFERSIZE 8
#define MY_INTERFACE_INCLUDED
#endif
E:\Temp> type my.source
#include <stdio.h>
#include "my.interface"
int main(void) {
char x[MYBUFFERSIZE] = {0};
x[0] = 'a';
puts(x);
return 0;
}
E:\Temp> gcc -x c my.source -o my.exe
E:\Temp> my
a
Они не являются файлами библиотеки. Это всего лишь исходные файлы. Как сказал Стефано, файл .c является исходным C файлом, который фактически использует/определяет фактический источник того, что он просто обозначил в файле .h, файле заголовка. В файле заголовка обычно описываются все прототипы и структуры функций, которые будут использоваться в фактическом исходном файле. Подумайте об этом как о ссылке/приложении. Это видно при просмотре файла заголовка, как вы увидите. Итак, когда вы хотите использовать что-то, что было написано в этих исходных файлах, вы #include
заголовочный файл, который содержит информацию, необходимую компилятору для знать.
.c - это исходный файл, а .h - заголовочный файл .
Файлы .c являются исходными файлами, которые будут скомпилированы. Файлы .h используются для отображения API программы для любой другой части этой программы или другой программы - вы создаете библиотеку.
Например, программа PizzaDelivery может иметь 1.c файл с основной программой и 1.c файл с функциями утилиты. Теперь, чтобы основная часть программы могла использовать функции утилиты, вам нужно предоставить API через прототип функции в файл .h, этот файл .h будет включен в основной файл .c.
.c : 'C' source code
.h : Header file
Обычно файлы .c
содержат реализацию, а файлы .h
содержат "интерфейс" реализации.
Предположим, вам нужно открыть созданную c-программу из командной строки или с помощью любой IDE, а затем, если вы не сохранили файл на .c, тогда для IDE будет сложно искать и отличать ваш файл от других, что задерживает поиск. Итак .c сообщает тип файла и его источник как .java и другие.