Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 根据c++;标准_C++_C Preprocessor_Language Lawyer - Fatal编程技术网

C++ 根据c++;标准

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

我刚才回答了一个关于附加到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                           //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< <代码>和Apple Maula<代码>的结果是实现定义的,所以标准不规范他们的行为。见C11:

表单的预处理指令

 # 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< <代码>和Apple Maula<代码>的结果是实现定义的,所以标准不规范他们的行为。见C11:

表单的预处理指令

 # 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和”PraceMaG/<代码:关键概念:ISOC++语言标准不要求编译器支持任何语用,任何语用学都被忽略。他们的应用程序(在C++中比C中少),看起来你已经超过了宏地狱的大门。无论你想完成什么:停在这里,后退两步,然后再睡一觉。然后重新思考您的系统架构。@Tooonestforthis site有趣的是,我用该代码编写的文档名为
macro\u hell.cpp
每当您看到术语
pragma
时,通常意味着接下来的内容是非标准的。它可能出现在多个工具链中,但是,你不能期望它在所有或没有差异。尝试找到解决问题不涉及宏。文件为“Trace< Prace和”PraceMaG/<代码:关键概念:ISOC++语言标准不要求编译器支持任何语用,任何语用学都被忽略。他们的应用程序(在C++中比C中少),看起来你已经超过了宏地狱的大门。无论你想完成什么:停在这里,后退两步,然后再睡一觉。然后重新思考您的系统架构。@Tooonestforthis site有趣的是,我用该代码编写的文档名为
macro\u hell.cpp