【发布时间】:2016-02-20 15:59:55
【问题描述】:
出于好奇,我想知道是否可以定义一个可以将其参数转换为字符文字的宏:
switch(getchar()) {
case MYMACRO(A): printf("Received A\n"); break;
case MYMACRO(a): printf("Received a\n"); break;
case MYMACRO(!): printf("Received an exclamation mark\n"); break;
default: printf("Neither a nor A nor !\n"); break;
}
我想到了两种可能的解决方案:
枚举所有字符
#define LITERAL_a 'a'
#define LITERAL_b 'b'
...
#define MYMACRO(x) LITERAL_ ## x
它不适用于 MYMACRO(!),因为 ! 不是 C 标识符的有效组件。
将参数转换为字符串字面量
#define MYMACRO(x) #x [0]
它涉及指针解引用,并且在 case 标签等位置无效。
我并不是在寻求一种“改进”上述 switch 语句本身的方法。这只是一个玩具示例。重复。这只是一个玩具示例。
【问题讨论】:
-
我认为你的问题不是自洽的。首先,您要求一种使用宏“创建字符文字”的方法。然后您提出一个可能的解决方案,但它根本不会创建字符文字,而只会为您提供一个 char 值。您应该调整标题以实际表达您的追求。 “将x转换为等于'x'的编译时间值”?或者,您可以将“可能的解决方案”称为“尝试的解决方法”,但这取决于您所追求的。
-
有一个名为 charizing 的 Microsoft 特定解决方案:msdn.microsoft.com/library/91tt6dfs%28v=vs.110%29.aspx。但是,如果您需要符合标准,恐怕您会迷失方向。
-
即使使用像@ctx 指向的非标准扩展名,非部分函数显然也是不可能的,因为空格不是标记。无论如何,标准 C 并没有提供解决方案。
-
对于它的价值,
#define MYMACRO(x) 'x'在指定-traditional标志时在 GCC 中工作。这将排除所有现代宏定义,例如可变参数宏。 (我属于那些认为'x'足以表达字符文字的人的阵营。) -
@Ctx:当我指定
--traditional时,我只是再次尝试确定。 (这个answer on the C FAQ让我尝试了。)
标签: c macros c-preprocessor