какие файлы нужно включить в заголовочные файлы? Структуры? <Stdbool.h>? - PullRequest
2 голосов
/ 11 февраля 2010

Предположим, я определил структуру в "struct.h" следующим образом:

struct box {
    int value; 
}

и я использую эту структуру в другом файле, скажем "math.c"

#include "struct.h"

struct box *sum(struct box *a1, struct box *a2) {
    struct box *a3 = malloc(sizeof (struct box));
    a3->value = a1->value + a2->value;
    return a3;
}

нужно ли в "math.h" включать "struct.h"?

#include "struct.h"

struct box *sum(struct box *a1, struct box *a2);

А что, если struct box были заменены на bool, нужно ли включать stdbool.h как в заголовочный файл, так и в файл c? похоже, что компилятор хочет этого.

Когда следует включать файлы в заголовок, а не в .c? также интересно, есть ли что-то необычное с моим примером.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 11 февраля 2010

Общее правило - включать как можно меньше в заголовочные файлы.

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

В вашем конкретном примере вы можете вместо этого включить исключение struct.h из math.h и переслать объявление. Не то чтобы это имело огромное значение в этом конкретном случае.

3 голосов
/ 11 февраля 2010

будет необходимо включить "math.h" а также struct.h?

Нет, потому что в math.h (не очень хорошее название, кстати) вы имеете дело только с указателями на тип. Определение необходимо, только если вы имеете дело с экземплярами типа. Однако было бы целесообразно включить его, поскольку пользователь, который будет использовать трафик с реальными экземплярами, в противном случае должен будет включить его отдельно.

2 голосов
/ 11 февраля 2010

Включать другие включения в файл заголовка, если содержимое файла заголовка использует типы, определенные такими включениями. (Извините, это был глоток.) ​​

В вашем случае, math.h определенно должен включать struct.h, хотя я утверждаю, что ни одно из них не является хорошим именем для пользовательских заголовочных файлов (первое, потому что уже есть предоставляемая системой math.h; последнее, потому что struct - ключевое слово). : -Р

Если ваш заголовочный файл использует bool, тогда да, он должен включать stdbool.h.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...