2012-03-13 4 views
0

Предположим, у меня есть a.h, который включает в себя следующее:Препроцессор #ifndef

<stdbool.h> 
<stddef.h> 
<stdin.h> 

Предположим, у меня есть b.h, который также включает в себя <stdbool.h>. Если a.h содержит инструкцию определения препроцессора #ifndef, а b.h - нет. Будет ли a.h включить только то, что не было включено в b.h? Поэтому, когда b.h включает a.h, будет a.h включать stddef.h и stein.h и не включать повторно stdbool.h или это функции определения препроцессора, используемые только для проверки того, переопределен ли этот весь класс, а не какие-то конкретные функции внутри него?

EDIT:

Кроме того, предположим, что b.h включает другой заголовочный файл, который включает в себя stdbool.h -Вот делает b.h есть stdbool.h как от этого класса и a.h. Это вызовет ошибки?

ответ

1

Все стандартные заголовки C должны быть сделаны таким образом, что они могут быть включены в несколько раз и в любой заказ:

Standard headers may be included in any order; each may be included more than once in a given scope, with no effect different from being included only once

1

Если stdbool.h сам включает в себя охранники (#ifndef), тогда все будет хорошо. В противном случае вы можете в конечном итоге включить некоторые заголовки дважды. Это вызовет проблему? Это зависит. Если заголовок с двойным включением содержит только декларации, тогда все будет компилироваться - это займет всего несколько наносекунд. Представьте себе:

int the_answer(void); // <-- from first inclusion 
int the_answer(void); // <-- from from second inclusion - this is OK 
         //  at least as long as declarations are the same 

int main() 
{ 
    return the_answer(); 
} 

Если с другой стороны, будет определение это приведет к ошибке:

int the_answer(void) // <-- from first inclusion - OK so far 
{ 
    return 42; 
} 

int the_answer(void) // <-- from second inclusion 
{      //  error: redefinition of 'the_answer' 
    return 42; 
} 

int main() 
{ 
    return the_answer(); 
} 
+1

Определения в заголовках будут возникать ошибки связывания, если вы используете один и тот же заголовок из нескольких файлов, поэтому не делайте этого. –

0

Это нормально, что большинство заголовков начинаются с

#ifndef _HEADERFILENAME_H_ 
#define _HEADERFILENAME_H_ 

и конец следующей строкой:

#endif 

Если включить заголовок, в два раза, второй раз, когда ваша программа не будет включать в себя полный заголовок снова из-за #ifndef, #define и #endif

Смежные вопросы