三个文件
aaa.h
#ifndef AAA
#define AAA
#include <stdio.h>
int j;
void aaa();
#define BBB
#ifdef BBB
int i;
#endif
#endif
aaa.cpp
#include "aaa.h"
void aaa()
{
i=4;
j=1;
}
main.cpp
#include "aaa.h"
void main()
{
aaa();
printf("%d %d\n",i,j);
i=5;
j=2;
printf("%d %d\n",i,j);
}
建立工程之后,编译可以,连接通不过,BC31和VC6中都是如此,都是提示i,j在两个cpp文件中重复定义了
原先只是定义了i这个变量,提示错误,我还以为是ifdef不支持嵌套定义,又多定义了一个j,发现也是不行.
按理说,我的aaa.h中已经使用了防止重入的预编译指令,应该这个部分只编译一次的,但是为什么不能连接呢?
VC中的错误提示是说,i和j在aaa.obj和main.obj重复定义了,
我想可能是这样吧,每个CPP文件都会自己先生成一个obj文件,然后最后link在一起,每个obj文件中不能有同名的全局变量(因为编译器对我们定义的变量名会加几个前缀几个后缀,而两个文件中的全局变量加了前缀和后缀后是一样的,造成了重名.)
经过在网上寻找如何定义工程级的全局变量.找到了一种方法,
在aaa.h中定义extern int i;
在aaa.cpp中再定义全局变量int i;
然后在main.cpp和aaa.cpp中就可以使用同一个的i了
其实我的本意并不是想定义工程级的全局变量,只是想把变量定义都放在头文件里面而已,看来这样是不允许的.
经过测试,又发现在头文件中定义函数,VC是可以的,BC不可以,不过只要把函数弄成inline的,BC就允许了.
目前总结的规律(以BC为准,不过除了VC允许定义函数外,其它的都是一样的):
头文件中可以写预编译,可以写typedef,可以声明函数,可以声明或定义类,可以定义inline函数,可以声明extern变量
不可以定义非inline函数,不可以定义非extern非static的变量
可以定义static变量,不过不同cpp文件中的变量值不互相影响.