出于好奇,我想知道是否可以定义一个宏,该宏可以将其参数转换为字 rune 字:

 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]

它涉及指针取消引用,并且在案例标签等地方无效。

我不是在寻求一种“改善”上述switch语句本身的方法。这只是一个玩具的例子。重复。这只是一个玩具的例子。

最佳答案

尽管无法获得user4098326的编译答案,但确实获得了下面的解决方案,可以按预期进行编译和工作(在Code Composer Studio中)。关键是使用符号串联运算符。但是请注意,根据标准,这不起作用。单引号(')不是有效的标记,单引号后跟单个字符('a)也不是。因此,那些不应该是串联运算符的输入或输出。因此,我不建议您实际使用此解决方案。

#define CONCAT_H(x,y,z) x##y##z
#define SINGLEQUOTE '
#define CONCAT(x,y,z) CONCAT_H(x,y,z)
#define CHARIFY(x) CONCAT(SINGLEQUOTE , x , SINGLEQUOTE )

#define DO_CASE(...) case CHARIFY(__VA_ARGS__): printf("Got a " #__VA_ARGS__ "\n"); break

然后:
switch(getchar()) {
   DO_CASE(A);
   DO_CASE(a);
   DO_CASE(!);
   default: printf("Neither a nor A nor !\n"); break;
 }

关于C预处理程序: How to create a character literal?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35525555/

10-11 22:09