是否可以通过#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中另一个已定义表的选择