【发布时间】:2012-09-20 09:39:32
【问题描述】:
限制#define 标签范围并避免无根据的令牌冲突的正确策略是什么?
在以下配置中:
Main.c
# include "Utility_1.h"
# include "Utility_2.h"
# include "Utility_3.h"
VOID Main() { ... }
Utility_1.h
# define ZERO "Zero"
# define ONE "One"
BOOL Utility_1(); // Uses- ZERO:"Zero" & ONE:"One"
Utility_2.h
# define ZERO '0'
# define ONE '1'
BOOL Utility_2(); // Uses- ZERO:'0' & ONE:'1'
Utility_3.h
const UINT ZERO = 0;
const UINT ONE = 1;
BOOL Utility_3(); // Uses- ZERO:0 & ONE:1
注意: Utility _1、Utility_2 和 Utility_3 是独立编写的
错误:宏重新定义和令牌冲突
另外,最令人担忧的:编译器没有指出在令牌替换的情况下是什么替换了什么
{Edit} 注意:这是一个通用问题,所以请:不要提出enum或const
即什么时候做:我必须使用#define & _请在下面评论我提出的解决方案.. __
【问题讨论】:
-
您在某处缺少
#define VOID int。顺便说一句,我认为这是一个非常令人困惑的宏。 -
您问的是 C 还是 C++ - 或两者兼而有之?答案会因情况而异。
-
您应该给出一个必须使用#define 然后的实际示例(如 SO FAQ 中所述,您应该询问您遇到的实际问题)。否则,它是理论上的,而不是实际意义上的建设性的。
-
请不要过度编辑问题。您最近的编辑完全改变了含义。对于未来,请尝试提前发布所有要求。
-
@MSalters:如果你也有
#define Main main,你只需要#define VOID int。
标签: c++ c scope include c-preprocessor