关于C++头文件包含的问题 #ifndef #define #endif

我知道#ifndef #endif可以防止重复编译,这是什么意思呢,可能你包含了A.h也包含了B.h,但是A.h已经包含了B.h,如果B.h不用#ifndef #endif则会重复包含,假设B里面定义了一个变量int a;则会出现重复定义的错误,因为编译的时候打开A,A里面有B,就把B 也打开了,然后又包含B,又把B打开一次,然后就出错了,所以加了#ifndef #endif就只会编译一次了,包含A的时候编译过B 了,所以再包含B 的时候就跳过了。(问题1:关于具体是如何跳过的我其实并不清楚,不知道是包含的时候直接跳过还是仅编译的部分跳过了,然后还是包含了上次编译好的头文件)这是对一个CPP文件是这样的,假设AB都写了#ifndef #endif,但是AB在另一个CPP里面出现了,这句#ifndef #endif是不是不起作用,问题2:即#ifndef #endif只是保证同一个CPP中的头文件不会重复编译?不同的CPP会单独把头文件展开

Q:关于具体是如何跳过的我其实并不清楚,不知道是包含的时候直接跳过还是仅编译的部分跳过了,然后还是包含了上次编译好的头文件)
A: 包含的时候直接跳过的。(不过这个包含是在编译的时候才做的事)
Q:这是对一个CPP文件是这样的,假设AB都写了#ifndef #endif,但是AB在另一个CPP里面出现了,这句#ifndef #endif是不是不起作用,
A:起作用。
Q:即#ifndef #endif只是保证同一个CPP中的头文件不会重复编译?
A:#ifndef会保证不会重复引用,避免编译错误。但是,不是为了避免“使用在同一个CPP中的”。而是为了避免“任何导致重复引用的情况”,包括“在同一个cpp文件中”。例如:A.h中引入了B.h,而B.h中也引入了A.h,这样,任何使用A.h或者B.h的地方(包括其他头文件)都会发生重复定义错误。
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答