使用#ifndef时定义的具体是什么

时间:2017-01-15 22:15:58

标签: c++ compilation linker c-preprocessor

什么是" ICT_TOOLS_H __"?它是我在这里定义的标题,还是布尔值,或1或0的int?名称是否必须与头文件相同,还是可以是自定义名称?另外,如果标题包含在多个.cpp文件中,我是否会使用#ifndef,或者我是否应该使用#ifndef,即使它只包含#include一次?当编译器第一次运行时," ICT_TOOLS_H __"得到定义,并在每次其他通过它不重新编译标题,防止相同标题的多次编译?

#ifndef ICT_TOOLS_H__ //my proff said to start the name with "ICT_", its the programming department
#define ICT_TOOLS_H__


//implementation goes here

#endif

2 个答案:

答案 0 :(得分:1)

不是它是用于inclusion guard条件包含的宏,所以首先总是没有定义这个宏,所以条件成功,内容被添加到源/头(包括在内),第二次条件将失败,因此不会再次添加内容。

当有多个源/头文件时,这可以包含两次或更多的标题。

//header.h

#ifndef MY_HEADER_H // the name can be anything 
#define MY_HEADER_H
// code here (some declarations)

int value;

#endif

//source.cpp

#include "header.h"
#include "header.h"

int main()
{
     value = 0; // for example

     return 0;
}

如果删除包含保护,那么header.h的内容将被添加两次,因此会有两个变量value,这就是编译时错误(重新定义)。

答案 1 :(得分:0)

它们基本上是宏,用于条件编译。 这是他们如何工作编译首先检查是否有一个已定义的宏在您的情况下调用ICT_TOOLS_H__如果没有定义,那么#ifndef和#endif之间的整个代码将编译,并且下一行表示它将定义该宏并将做个警卫不要再编译它。

如果代码编译多次,则违反了c ++ one定义规则。见https://en.m.wikipedia.org/wiki/One_Definition_Rule