Язык C: рекурсивный #include - PullRequest
1 голос
/ 15 июля 2011

Я сталкивался с таким фрагментом кода:

ах:

#include "b.h"
/* structure definitions, macros etc. */

bh:

    #include "a.h"
/* structure definitions, macros etc. */

Является ли это законным с точки зрения стандарта C?Я думаю, такой подход небезопасен.

Ответы [ 4 ]

6 голосов
/ 15 июля 2011

Вам необходимо использовать включая охрану .Тогда это будет безопасно.

a.h
#ifndef A_H
#define A_H
/* ... */

#endif
4 голосов
/ 15 июля 2011

Это законно.Все известные мне компиляторы устанавливают предел вложенности, обычно в диапазоне от 20 до 50. Рекурсию, если она полезна, легко контролировать с помощью условных выражений:

#if NESTING < 5
 #define NESTING NESTING+1
 #include "myself.h"
#endif

Существуют тысячи способов застрелитьсянога как программист.Это всего лишь еще один способ.Будьте осторожны.

2 голосов
/ 15 июля 2011

Вот где include guards пригодятся.

1 голос
/ 15 июля 2011

Это законно. Но это не обязательно приведет к чему-либо полезному. Используйте предварительные объявления и включайте охрану, чтобы избавиться от таких циклических зависимостей.

...