[原创]关于C++中头文件的测试

作者在 2008-01-03 18:55:51 发布以下内容

三个文件

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文件中的变量值不互相影响.

原创 | 阅读 2502 次
文章评论,共0条
游客请输入验证码