C++ 根据c++;标准
我刚才回答了一个关于附加到C宏的问题 在 正如答案所说,下面的代码在clang和g++中都有效,但在msvc中不起作用C++ 根据c++;标准,c++,c-preprocessor,language-lawyer,C++,C Preprocessor,Language Lawyer,我刚才回答了一个关于附加到C宏的问题 在 正如答案所说,下面的代码在clang和g++中都有效,但在msvc中不起作用 #define pushfoo _Pragma("push_macro(\"foo\")") //for convenience #define popfoo _Pragma("pop_macro(\"foo\")") //I tried __pragma and __Pragma for msvc as well #define foo 1 pushfoo
#define pushfoo _Pragma("push_macro(\"foo\")") //for convenience
#define popfoo _Pragma("pop_macro(\"foo\")") //I tried __pragma and __Pragma for msvc as well
#define foo 1
pushfoo //push the old value
#undef foo //so you don't get a warning on the next line
#define foo popfoo foo , 2 //append to the previous value of foo
pushfoo
#undef foo
#define foo popfoo foo , 3
pushfoo
#undef foo
#define foo popfoo foo , 4
foo //this whole list will expand to something like popfoo foo popfoo foo popfoo foo , 4
//which will in turn expand to 1 , 2 , 3 , 4
foo //the second time this will expand to just 1
虽然这似乎是可行的,但我想知道这是否只是gcc的一个巧合
和叮当声,但msvc也是(或只是)正确的,或者如果他们表现出的行为是强制性的
根据语言规范。如果C和C++有区别,我对C和C++都感兴趣(对
最新版本,撰写本文时的C18和C++17)
< P>在宏定义中按C++标准推/弹出宏的行为是什么?< /P>
在C++和C++中,<代码> > PrimaM< <代码>和 # pragma pp-tokensopt new-line
# pragma pp-tokensopt new-line
如果预处理令牌STDC没有立即遵循指令中的pragma(在任何宏替换之前)174,会导致实现以实现定义的方式运行。该行为可能会导致转换失败或导致转换器或生成的程序以不一致的方式运行。任何未被实现识别的此类杂注都将被忽略
包括\u Pragma
和最新C++草案:
表单的预处理指令 # pragma pp-tokensopt new-line
# pragma pp-tokensopt new-line
使实现以实现定义的方式运行。*
该行为可能导致翻译失败,或导致翻译器或生成的程序以不一致的方式运行。
任何未被实现识别的杂注都将被忽略
也看到
这些pragam的文档都不是来自或似乎不是很详细。所以他们没有提供太多的指导
< P>在宏定义中按C++标准推/弹出宏的行为是什么?< /P>
在C++和C++中,<代码> > PrimaM< <代码>和 # pragma pp-tokensopt new-line
# pragma pp-tokensopt new-line
如果预处理令牌STDC没有立即遵循指令中的pragma(在任何宏替换之前)174,会导致实现以实现定义的方式运行。该行为可能会导致转换失败或导致转换器或生成的程序以不一致的方式运行。任何未被实现识别的此类杂注都将被忽略
包括\u Pragma
和最新C++草案:
表单的预处理指令 # pragma pp-tokensopt new-line
# pragma pp-tokensopt new-line
使实现以实现定义的方式运行。*
该行为可能导致翻译失败,或导致翻译器或生成的程序以不一致的方式运行。
任何未被实现识别的杂注都将被忽略
也看到
这些pragam的文档都不是来自或似乎不是很详细。所以他们没有提供太多的指导。任何时候你看到术语
pragma
通常意味着接下来的内容是非标准的。它可能出现在多个工具链中,但是,你不能期望它在所有或没有差异。尝试找到解决问题不涉及宏。文件为“Trace< Prace和macro\u hell.cpp
每当您看到术语pragma
时,通常意味着接下来的内容是非标准的。它可能出现在多个工具链中,但是,你不能期望它在所有或没有差异。尝试找到解决问题不涉及宏。文件为“Trace< Prace和macro\u hell.cpp