视觉 C++预处理器中的 R 和 L 有什么特别之处?
visual What's special about R and L in the C++ preprocessor?
我通过Visual Studio 2013预处理器运行了以下代码。输出让我大吃一惊。
hello.cpp:的内容
#define A(j) #j
A(A?)
A(B?)
A(C?)
A(D?)
A(E?)
A(F?)
A(G?)
A(H?)
A(I?)
A(J?)
A(K?)
A(L?)
A(M?)
A(N?)
A(O?)
A(P?)
A(Q?)
A(R?)
A(S?)
A(T?)
A(U?)
A(V?)
A(W?)
A(X?)
A(Y?)
A(Z?)
命令:
cl /P hello.cpp
你好。我包含:
#line 1 "hello.cpp"
"A?"
"B?"
"C?"
"D?"
"E?"
"F?"
"G?"
"H?"
"I?"
"J?"
"K?"
"L"
"M?"
"N?"
"O?"
"P?"
"Q?"
"R"
"S?"
"T?"
"U?"
"V?"
"W?"
"X?"
"Y?"
"Z?"
我在尝试调用A(L?p:q)时遇到了这个问题,这导致了"Lp:q",这对我来说不好。
这是正确的、定义明确的C++吗?C++中的L和R有什么特别之处?如果文件的扩展名为.c,则L和R的处理方式与字母表的其余部分相同。这与C++11有关吗?这一定是一个新功能,因为旧版本的MSVS不会以特殊的方式处理L和R。
我能做些什么来阻止MSVS2013以这种特殊的方式处理L和R?
更新
看起来这个错误报告被标记为这个报告的副本,这个报告有一个更新,上面写着:
编译器源代码中已检查到此问题的修复程序。该修复程序应显示在Visual C++的下一个主要版本中。
原始
正如雷米亚贝尔指出的,这是一个已报告的错误。gcc
和clang
都不会产生此结果,并且根据Visual Studios
文档的字符串化运算符#,这些是以下替换(强调矿井前进):
忽略实际参数的第一个标记之前和实际参数的最后一个标记之后的空白。实际参数中标记之间的任何空白都将减少为结果字符串文字中的单个空白。因此,如果注释出现在实际参数中的两个标记之间,则该注释将减少为单个空白。生成的字符串文字会自动与任何相邻的字符串文字连接,这些字符串文字与这些字符串文字仅用空格分隔。
此外,如果参数中包含的字符在字符串文字中使用时通常需要转义序列(例如,引号(")或反斜杠()字符),则必要的转义反斜杠会自动插入该字符之前。
对应C++草案标准部分16.3.2
#运算符表示:
如果在替换列表中,一个参数前面紧接着一个#预处理令牌,则这两个参数都将被一个包含相应预处理令牌序列拼写的单字符串文字预处理令牌所替换论点参数的预处理标记之间每次出现空白都会成为字符串文字中的一个空格字符。删除包括自变量的第一个预处理令牌之前和最后一个预处理标记之后的空白。否则,参数中每个预处理标记的原始拼写将保留在字符串文字中,除非对生成字符串文字和字符文字的拼写进行特殊处理:在字符文字或字符串文字的每个"answers"字符(包括分隔符)之前插入\字符。
R
和L
与C++11相关的唯一一点是,它们对字符串文字有特殊意义,但我不知道这会对这种情况产生什么影响。
看起来L
和R
也产生了相同的问题。
他们确实记录了一个不合规的问题,上面写着:
当#(stringize)运算符与包含转义序列的字符串一起使用时,Visual C++的行为不正确。在这种情况下,编译器将生成编译器错误C2017。
不包括这种情况。
这似乎是MSVC预处理器中的一个错误。好消息是,根据你对输出的挑剔程度,你可以在R或L后面放一个空格来解决这个问题。
A(L ?p:q), // "L ?p:q"
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 为什么预处理宏是邪恶的,还有什么选择
- 编译器中的预处理到底是什么意思
- 在经过预处理的C++代码中,#的含义是什么
- gcc 预处理的表单哈希符号 + 数字"# 1"输出行是什么意思?
- C预处理文件中这些不熟悉的行是什么