在C语言中,“# @”有什么用?

6

#符号用于预处理指令的开头(如#ifdef#define等)。#还用作字符串化运算符。

##是标记粘贴运算符。

之后我在一个在线测验中看到了这个:

#define MAKECHAR(operand) #@operand

运算符#@是什么,它用于什么?

2
你为什么认为这有特殊的含义? - Gerhardh
2
标准C中不存在#@这样的东西。 - Lundin
1
我从未听说 @ 在 C 语言中有任何含义。我会认为这是一种专有扩展。如果是这样,应该在相应的 C 编译器文档中有所记录。 - Scheff's Cat
1
这不是标准的C语言,但是微软的预处理器有一个类似于(标准的)字符串化操作符#的“字符化”操作符#@ - M Oehm
1
@bhura112 我已经对你的问题进行了相当大的编辑 - 现在好多了 ;) - Antti Haapala -- Слава Україні
显示剩余7条评论
1个回答

6

这是一个类比于 stringify 标记 # 但针对字符的概念,但它并没有被标准化。例如,clang/llvm 不支持它。

为了展示这个类比:

#define MESSAGE(x) printf("%s: %d\n", #x, x)

int main(){
    int i = 5;
    MESSAGE(i); // expands to printf("%s: %d\n", "i", x)
    return 0;
}

输出结果如下:

i: 5

如果你使用支持#@的编译器,你可以这样写:

#define MESSAGE(x) printf("%c: %d\n", #@x, x)

int main(){
    int i = 5;
    MESSAGE(i);  // expands to printf("%c: %d\n", 'i', x)
    return 0;
}

1
这个字符化运算符唯一好的地方似乎是它是一个整数常量表达式 - 否则它是相当无用的,可以通过字符串化和解引用轻松规避。 - Antti Haapala -- Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接