社区
C++ 语言
帖子详情
关于条件编译的问题
jzd1997
2004-09-16 02:35:42
我在common.h中定义了几个全局的对象,在sql.h和check.h当中都需要引用这个文件,为了防止重复定义,用如下的方式定义。
#ifndef CHK_COMMON
#define CHK_COMMON
OSession sess;
ODatabase datab;
oresult ores;
#endif
但是还是编译出错,说sess等已经定义了。请各位帮忙阿!
...全文
194
10
打赏
收藏
关于条件编译的问题
我在common.h中定义了几个全局的对象,在sql.h和check.h当中都需要引用这个文件,为了防止重复定义,用如下的方式定义。 #ifndef CHK_COMMON #define CHK_COMMON OSession sess; ODatabase datab; oresult ores; #endif 但是还是编译出错,说sess等已经定义了。请各位帮忙阿!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jzd1997
2004-09-20
打赏
举报
回复
谢谢各位老大指点.
248406869
2004-09-16
打赏
举报
回复
编译器会把每一个cpp文件作为一个翻译单元,#define CHK_COMMON只是在本翻译单元内有效,在别的翻译单元中还是没有定义这个宏。
neverfor
2004-09-16
打赏
举报
回复
你对条件编译的理解有问题;
你的common.h只是防止嵌套包含,比如头文件my.h中有#include "common.h"。而在别的文件中要用到common.h和my.h,你可能会这样写:#include "my.h";#include "common.h" 这个时候你的条件编译就起了作用。他不common.h中的内容两次放进去。
但是对于全局变量,
比如你有两个cpp文件,都用到了common.h
则common.h中定义的变量在两个cpp中都存在了,就重复定义了。
一般而言,在头文件中定义全局变量并不是一种好的编程习惯。正确的做法应该是在cpp中定义,然后在一个头文件中申明
jzd1997
2004-09-16
打赏
举报
回复
大家说的extern是可以,在其他地方定义这些全局变量,已经编译通过了。
但是为什么我的条件编译没起作用呢?如果定要在common.h当中定义,怎么办?
pacman2000
2004-09-16
打赏
举报
回复
把定义放到.c或者.cpp的文件中去。
miria
2004-09-16
打赏
举报
回复
你已经违背了C++中的一次定义,多次声明原则!
C中int x;是声明必须放在可执行语句之前,
C++中,int x:是定义可以放在任何地方
kobefly
2004-09-16
打赏
举报
回复
没看出来啊
柯本
2004-09-16
打赏
举报
回复
//在common.h中
#ifndef CHK_COMMON
#define CHK_COMMON
extern OSession sess;
extern ODatabase datab;
extern oresult ores;
#endif
然后在主文件里定义:
OSession sess;
ODatabase datab;
oresult ores;
freefalcon
2004-09-16
打赏
举报
回复
头文件中只声名,在某个源文件中定义
#ifndef CHK_COMMON
#define CHK_COMMON
extern OSession sess;
extern ODatabase datab;
extern oresult ores;
#endif
在某个源文件中定义
OSession sess;
ODatabase datab;
oresult ores;
darkstar21cn
2004-09-16
打赏
举报
回复
extern
C++ 语言
64,654
社区成员
250,484
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章