本文介绍了在C ++ 11应该发生什么首先:原始字符串扩展或宏?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此代码适用于Visual C ++ 2013,但不在gcc / clang中:

  #if 0 
R foo(
#else
int dostuff(){return 23;}
//)foo;
#endif
dostuff();

Visual C ++首先删除if 0。 Clang首先扩展R原始字符串(而不是定义dostuff)。谁是对的,为什么?

解决方案

GCC和clang是对的,VC ++是错误的。

并且 2.5预处理标记[lex.pptoken] string-literals



因此,需要解析字符串文字,消耗 #else dostuff 函数定义。


This code works in Visual C++ 2013 but not in gcc/clang:

#if 0
R"foo(
#else
int dostuff () { return 23; }
// )foo";
#endif
dostuff();

Visual C++ removes the if 0 first. Clang expands the R raw string first (and never defining dostuff). Who is right and why?

解决方案

GCC and clang are right, VC++ is wrong.

And 2.5 Preprocessing tokens [lex.pptoken] lists string-literals amongst the tokens.

Consequently, parsing is required to tokenise the string literal first, "consuming" the #else and dostuff function definition.

这篇关于在C ++ 11应该发生什么首先:原始字符串扩展或宏?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-20 22:09