С:Включения в заголовки
-
05-07-2019 - |
Вопрос
Если у меня есть следующее:
/*
* 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
е...зависимости?(т.е.: #include <stdio.h>
)
Решение
Правильно. Вот почему рекомендуется ограничивать количество необходимых заголовков, включенных в другие заголовки.Препроцессор заменит директиву «#include» на содержимое stdio.h, поэтому ваш заголовок будет выглядеть примерно так для компилятора:
/*
* example.h
*/
#ifndef EXAMPLE
#define EXAMPLE
<contents of stdio.h>
extern int parse_string(FILE *, char const*, const unsigned int);
#endif
Другие советы
Да
Но если код зависит от <stdio>
, вероятно, следует включить его.(После всего, <stdio>
также имеет множественную защиту от включения.)
Если вам нужно главное включение для вашего проекта, сделайте его, но включите в него как фактические заголовки, так и общие системные заголовки, но без прототипов, объявлений или макросов.То есть мега-включение ничего не делает, кроме включения.Таким образом, отдельные модули могут принимать собственные решения по мере развития программы.
Да, вы можете это сделать, и это даст желаемый эффект.
Для вашего конкретного примера вам нужно FILE
объявлен в <stdio.h>, поэтому его полезно включить.
Если используется прототип parse_string() size_t
вместо unsigned int
и const char *
(для имени файла) вместо FILE *
, я бы включил <stddef.h> в "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