关于条件编译的问题

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 打赏 收藏 转发到动态 举报
写回复
用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

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧