C: включения в заголовки - PullRequest
       42

C: включения в заголовки

2 голосов
/ 10 сентября 2009

Если у меня есть следующее:

/*
 * example.h
 */

#ifndef EXAMPLE
#define EXAMPLE

#include <stdio.h>

extern int parse_string(FILE *, char const*, const unsigned int);

#endif


Будет ли это означать, что коду, который использует ... #include example.h ... не нужно будет ... #include example.h s ... зависимости? (т.е.: #include <stdio.h>)

Ответы [ 3 ]

2 голосов
/ 10 сентября 2009

Да

Но если код зависит от <stdio>, он, вероятно, должен включать его. (В конце концов, <stdio> также имеет защиту от множественного включения.)

Если то, что вы хотите, является основным включением для вашего проекта, тогда сделайте так, чтобы оно было включено, но включало в себя как фактические заголовки, так и общие системные заголовки, но без прототипов, объявлений или макросов. То есть у мега включения ничего не делать, кроме включений. Таким образом, отдельные модули могут самостоятельно принимать решения по мере развития программы.

1 голос
/ 10 сентября 2009

Правильно - вот почему рекомендуется ограничивать необходимые заголовки, включенные в другие заголовки. Препроцессор заменит директиву #include содержимым stdio.h, поэтому ваш заголовок будет выглядеть примерно так для компилятора:

/*
 * example.h
 */

#ifndef EXAMPLE
#define EXAMPLE

<contents of stdio.h>

extern int parse_string(FILE *, char const*, const unsigned int);

#endif
0 голосов
/ 10 сентября 2009

Да, вы можете сделать это, и это даст желаемый эффект.

Для вашего конкретного примера вам нужно объявить FILE в , так что хорошо бы включить его.

Если бы прототип parse_string () использовал size_t вместо unsigned int и const char * (для имени файла) вместо FILE *, я бы включил в "example.h"

#ifndef EXAMPLE
#define EXAMPLE
#include <stddef.h> /* size_t typedef */
extern int parse_string(const char *filename, char const*, const size_t);
#endif
...