Hen*_*nry 11 c gcc language-lawyer c-preprocessor
我正在使用gcc(特别是avr-gcc).
所以这是我的难题:
假设我在某处定义了这些:
#define THING_0_A 0
#define THING_0_B 1
#define THING_1_A 0
Run Code Online (Sandbox Code Playgroud)
然后在第二个文件中我有这个:
#define CONCAT_(A,B,C) A ## B ## C
#define CONCAT(A,B,C) CONCAT_(A,B,C)
#define ID 0
#define THING_N(A) CONCAT(THING_,ID,A)
Run Code Online (Sandbox Code Playgroud)
有了这个我现在有一些表达式(仍然在第二个文件中):
THING_N(_A) // evaluates to 0
THING_N(_B) // evaluates to 1
THING_N(_C) // evaluates to... nothing? Or undefined? Or THING_0_C?
Run Code Online (Sandbox Code Playgroud)
现在,我正在努力解决的是如何做到这一点(还在第二个文件中):
#ifdef THING_N(_A)
// Do something knowing that THING_N(_A) is defined (in this case THING_0_A)
#endif
Run Code Online (Sandbox Code Playgroud)
要么:
#if THING_N(_A)
// Do something knowing that the value THING_N(_A) evaluates to is defined and not just "nothing"
#endif
Run Code Online (Sandbox Code Playgroud)
当然,这些工作的既不因为#ifdef来不能把表达式作为参数(和它最终会为"0的#ifdef"反正),和THING_N(_A)的计算结果为0的#if内.
换句话说,我正在寻找一种方法来使预处理器评估:
THING_N(_A) to true
THING_N(_B) to true
THING_N(_C) to false
THING_N(_D) to false
etc...
Run Code Online (Sandbox Code Playgroud)
在条件中使用.
因此,经过大量研究和实验后,我得出的结论是我的问题没有解决方案,其原因实际上很简单。
鉴于我在问题中的设置,表达式的计算结果如下:
THING_N(_A) -> THING_0_A -> 0
THING_N(_B) -> THING_0_B -> 1
THING_N(_C) -> THING_0_C -> 0 (Not nothing, as I previously thought.)
Run Code Online (Sandbox Code Playgroud)
我之前遗漏的一条信息是,根据 c99 标准,未定义的标识符将被转换为 0,而不是什么都没有,从而无法区分未定义的内容和定义为 0 的内容。
如果 c99 标准选择让未定义的标识符评估为空,就像#define FOO让 FOO 评估为空一样,那么 atturi 的解决方案就会起作用。
那好吧。