我可以在没有单引号的宏中使用字符常量来产生常量吗?

时间:2016-04-07 15:55:48

标签: c gcc macros

我在AIX下开发时有一个我愚蠢设置的宏。它生成一个'触发'值,我在case switch中使用它。像这样:

#define TRIGGER_BUTTON(c) ((WIDGET_BUTTON << 16) | 'c')

意味着用于案例开关,如下所示:

switch(GetTrigger()) {
case TRIGGER_BUTTON(A):    /* This constant sent by button A */
    break;
}

AIX xlc编译器处理得很好,但gcc没有。事实证明它不是合法的C,但我有大量的代码使用这个宏。我可以运行批量sed脚本并更改所有代码以使用需要您使用引用的触发器字符对其进行编码的新宏,但我在此处发现了一个似乎建议使用便携式解决方案的帖子。

#define TRIGGER_BUTTON(c) ((WIDGET_BUTTON << 16) | ##c[0])

这是有效的,因为AIX编译器和gcc都接受它。但问题是生成的扩展不是有效的整数常量,因此不能在case开关中使用。我猜它生成的代码实际上是在运行时将组合的整数值放在从宏参数创建的常量字符串中 - 而不是在编译时生成一个常量整数。

printf("%x\n", TRIGGER_BUTTON(A));

正确打印30041(其中WIDGET_BUTTON定义为3)

但编译器将TRIGGER_BUTTON(A)作为无效的整数表达式吐出。

所以,回到绘图板 - 或者我的sed脚本,如果必须的话。任何人都可以想到一种将非引用字符串行化并将其转换为整数常量的方法吗?

不这么认为......; - )

但无论如何,谢谢。

0 个答案:

没有答案