为什么#ifdef,#ifndef不起作用?它的作用只针对宏,不针对其他变量、结构体等的定义?

BBtempShow 2015-07-31 07:22:24

为什么下面代码,编译时会报错:m1重复定义?

不是加了#ifndef了吗?

如果我要判断一个类是否已经有定义,应该用什么方法?



class m1
{
};

#ifndef m1
class m1
{
};
#endif













...全文
770 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
勤奋的小游侠 2015-07-31
  • 打赏
  • 举报
回复
确实是只指对宏。 因为预处理和编译是分二个阶段的 在预处理时,还没有变量这个概念。 预处理器只认识字符,对类啊,结构体啊,语法啊什么的,它完全不知道是怎么回事。
Saleayas 2015-07-31
  • 打赏
  • 举报
回复
使用这个宏来区分 MSVC 的版本 _MSC_VER
king191923157 2015-07-31
  • 打赏
  • 举报
回复
#ifndef 对应的TRUE 是对用#define 定义的东西,其他自定义的没有关系
BBtempShow 2015-07-31
  • 打赏
  • 举报
回复
引用 4 楼 Saleayas 的回复:
类是否定义,这个是语法。 而宏处理是词法。 宏处理的时候,语义还没有呢。
明白你的意思了。 我的场景是这样的: 有一些结构体,VC120库中是有定义的,而VC90库中,并没有定义。 所以,我在代码里面自己定义了一遍这些结构体(名字一样的),希望做到这样的效果: 工程无论在VC120下,还是在VC90下,都能编译通过。 有什么方法?
Saleayas 2015-07-31
  • 打赏
  • 举报
回复
类是否定义,这个是语法。 而宏处理是词法。 宏处理的时候,语义还没有呢。
二班的码农 2015-07-31
  • 打赏
  • 举报
回复
宏名不要和类名相同, 楼主可以改改宏名,如将宏m1,改成CLASS_M1 而且命名规范中一般宏名都是大写
微型蚂蚁 2015-07-31
  • 打赏
  • 举报
回复
#ifndef m1 和 class m1分属编译的不同阶段 #ifndef 这一类的属于条件预编译指令在预编译阶段处理 class m1需要到编译阶段处理 不能指望在预编译阶段就处理编译阶段才能分析出的内容。 所以这样判断不出m1是否被定义 可以这样 #ifndef m1 #define m1 class m1 {}; #endif 后面也这样写 #ifndef m1 //此时可以判断之前有没有定义了。 #define m1 class m1 {}; #endif
zxx178239 2015-07-31
  • 打赏
  • 举报
回复
常用 #ifndef xxx #define xxx ...... #endif 的形式用来防止出现多次包含.h文件引起的重定义问题 你举得例子是什么意思?要定义两个同名的类?
赵4老师 2015-07-31
  • 打赏
  • 举报
回复
编译期 运行期

64,639

社区成员

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

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