是否可以通过#define 将 g++ 设置为遵循 C++11 ISO (-std=c++11)?

Posted

技术标签:

【中文标题】是否可以通过#define 将 g++ 设置为遵循 C++11 ISO (-std=c++11)?【英文标题】:Is it possible to set g++ to follow C++11 ISO (-std=c++11) through #define? 【发布时间】:2018-11-15 14:04:12 【问题描述】:

我对 c++11 很陌生,我想知道一些事情......

我正在使用 Code::Blocks,如果我要在这个 IDE 中使用 c++11,我必须转到编译器设置,然后检查“Have g++ follow the C++11 ISO C++ language standard

是否有任何解决方法,以便我可以在这样的#define 语句中设置单个.cpp 文件以使用c++11

注意:这是一个“构建”文件,而不是项目

通过不在项目中设置编译选项,它会将其设置为我不希望发生的全局编译选项

我知道您可以在项目文件中自定义构建选项,它只会为该项目设置c++11

#include <iostream>

#define -std c++11

int main()

    #if __cplusplus==201402L
        std::cout << "C++14" << std::endl;
    #elif __cplusplus==201103L
        std::cout << "C++11" << std::endl;
    #else
        std::cout << "C++" << std::endl;
    #endif
    return 0;

我发现了什么:

更改#define __cplusplus 201103L 不是一个好主意,因为它不会将编译器设置为编译为c++11

【问题讨论】:

只设置一个文件不是一个好主意。 按照您的描述调整编译器设置有什么问题? 这样的#define(或#pragma)没有意义。它可能出现在源代码的中间。在这种情况下该怎么办?在源代码中间更改 C++ 的标准。 (在极端情况下,这可能会导致语法的轻微变化。) 更改 #define __cplusplus 不仅不是一个好主意,而且也是非法的,因为这是一个保留的标识符。 @HolyBlackCat 因为全局编译器设置。如果我要编译单个文件(不是项目),并且我设置了编译器选项,它设置为全局,我打开的其他文件将遵循c++1 而且,当我的朋友复制文件时,他会搞不清楚为什么代码会出错,因为他不明白如何设置编译选项 【参考方案1】:

虽然我可以看到源文件在这方面是自记录的,但这是不可能的。

接下来最好的事情是测试一致性,就像你已经开始做的那样:

#if __cplusplus < 201103L
#error This source must be compiled as C++11 or later
#endif

这可确保使用 C++03 编译器进行编译时会立即给出简单易懂的错误消息。

【讨论】:

我认为它必须被引用,但刚刚发现Error directive:error_message 可以包含多个单词不一定在引号中【参考方案2】:

是否可以将 g++ 设置为遵循 C++11 ISO (-std=c++11) 到 #define

C++ 和 g++ 都没有这个特性。您可能想要手动构建简单的单文件程序。

【讨论】:

【参考方案3】:

您不应该更改#define __cplusplus。在How to trigger the __cplusplus (C++) #ifdef? 中阅读更多内容,因为__cplusplus 应该由C++ 编译器自动定义。这就是为什么要通过编译器设置来更改版本。

例如,让一个文件遵循 C++11 而其他文件遵循 C++14 是没有意义的。整个项目应该以同质的方式编译。

请注意,您的代码无法编译:Error: macro names must be identifiers using #ifdef 0。

PS:如果你描述的是一个好主意,那在可读性和维护方面将是一场噩梦......

【讨论】:

想象各种可能性! #define -std Pascal ... #define -std Ada ... #define -std C++1985 ... #define -std C++17` ... #define -std VB.NET。什么可以去 wnorg? @Eljay 它会让事情变得……辣! 如果它是一个项目,是的!这将是一场噩梦,但这是一个单独的构建文件,所以应该没有任何问题。 @SazeimSaheem 我明白你的意思,但无论如何,这是不可能的。你问了一个好问题,你应该得到我的支持!干杯

以上是关于是否可以通过#define 将 g++ 设置为遵循 C++11 ISO (-std=c++11)?的主要内容,如果未能解决你的问题,请参考以下文章

当#movingtogitlab:是否有可能将所有导入的项目设置为公共?

如何将DEFINE变量设置为等于PL / SQL中另一个已定义表的选择

CMAKE - 调试/交叉构建?

是否可以在 Adob​​e Flex 中进行#define?

宏定义的define和typedef的区别

define定义变量