【发布时间】:2016-08-11 14:18:26
【问题描述】:
我正在使用 gcc(特别是 avr-gcc)。
所以这是我的难题:
假设我在某处定义了这些:
#define THING_0_A 0
#define THING_0_B 1
#define THING_1_A 0
然后在第二个文件中我有这个:
#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)
有了这个,我现在有一个选择的表达式(仍在第二个文件中):
THING_N(_A) // evaluates to 0
THING_N(_B) // evaluates to 1
THING_N(_C) // evaluates to... nothing? Or undefined? Or THING_0_C?
现在,我要解决的是如何做到这一点(也在第二个文件中):
#ifdef THING_N(_A)
// Do something knowing that THING_N(_A) is defined (in this case THING_0_A)
#endif
或者:
#if THING_N(_A)
// Do something knowing that the value THING_N(_A) evaluates to is defined and not just "nothing"
#endif
当然,这些都不起作用,因为 #ifdef 不能将表达式作为参数(无论如何它都会以“#ifdef 0”结尾),并且 THING_N(_A) 在 #if 内的计算结果为 0。
换句话说,我正在寻找一种让预处理器进行评估的方法:
THING_N(_A) to true
THING_N(_B) to true
THING_N(_C) to false
THING_N(_D) to false
etc...
用于条件句。
【问题讨论】:
-
听起来很典型的XY problem。
-
你说的很对,这听起来确实像一个 XY 问题(我很高兴你提到它,因为我以前没有听说过这个名字),但在这种情况下,上面提到的是我的X. 如果有人可以计算出 Y,那么也许我将来会将该 Y 应用于 X。 (即,我问这个是为了好玩、好奇和渴望更好地理解 c 预处理器的工作方式。)
-
如果问题没有实际目的,您可以随时添加“language-lawyer”标签,这意味着您只是对语言机制感兴趣而不是试图解决现实世界问题。
标签: c gcc c-preprocessor language-lawyer