Подтвердить что ты не робот

Что делать с расширениями .c и .h для C?

Все в заголовке; супер-простой, я считаю, но так трудно найти синтаксические вещи где-нибудь.

Это два файла библиотеки, которые я копирую из CS50.net, и мне интересно, почему у них есть два разных расширения.

4b9b3361

Ответ 1

.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(целое!), Что является пустой тратой времени и источником проблем.

Ответ 2

Конечно, нет ничего, что говорит о том, что расширение файла заголовка должно быть .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

Ответ 3

Они не являются файлами библиотеки. Это всего лишь исходные файлы. Как сказал Стефано, файл .c является исходным C файлом, который фактически использует/определяет фактический источник того, что он просто обозначил в файле .h, файле заголовка. В файле заголовка обычно описываются все прототипы и структуры функций, которые будут использоваться в фактическом исходном файле. Подумайте об этом как о ссылке/приложении. Это видно при просмотре файла заголовка, как вы увидите. Итак, когда вы хотите использовать что-то, что было написано в этих исходных файлах, вы #include заголовочный файл, который содержит информацию, необходимую компилятору для знать.

Ответ 4

.c - это исходный файл, а .h - заголовочный файл .

Ответ 5

Файлы .c являются исходными файлами, которые будут скомпилированы. Файлы .h используются для отображения API программы для любой другой части этой программы или другой программы - вы создаете библиотеку.

Например, программа PizzaDelivery может иметь 1.c файл с основной программой и 1.c файл с функциями утилиты. Теперь, чтобы основная часть программы могла использовать функции утилиты, вам нужно предоставить API через прототип функции в файл .h, этот файл .h будет включен в основной файл .c.

Ответ 6

.c : 'C' source code
.h : Header file

Обычно файлы .c содержат реализацию, а файлы .h содержат "интерфейс" реализации.

Ответ 7

Предположим, вам нужно открыть созданную c-программу из командной строки или с помощью любой IDE, а затем, если вы не сохранили файл на .c, тогда для IDE будет сложно искать и отличать ваш файл от других, что задерживает поиск. Итак .c сообщает тип файла и его источник как .java и другие.