当我在if
中声明一个变量时,我的编译器会发出一个警告--但是它确实可以编译,尽管我使用的是c14,而不是正式引入这个特性的c17。
代码:
#include <iostream>
int foo(){
return 1;
}
int main(){
if (int x = foo(); x < 2){
std::cout << "bla bla\n";
}
return 0;
}
编制:
g++ ./bla.cpp --std=c++14 && ./a.out
编译器:
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
警告:
bla.cpp: In function ‘int main()’:
bla.cpp:6:9: warning: init-statement in selection statements only available with ‘-std=c++17’ or ‘-std=gnu++17’
6 | if (int x = foo(); x < 2){
|
这有意义吗?g 9.4.0实现了c17的特性,并且允许我在c++14中使用它,只是一个警告吗?
如果这是真的,在我的代码中使用它有什么坏处呢?我猜不是所有的编译器都会这么宽容,但是一旦代码被像我这样的宽容编译器编译,二进制代码就会像我期望的那样运行,(这是一个编译的可移植性问题,但没有运行时问题),对吗?
1条答案
按热度按时间gudnpqoy1#
g 9.4.0实现了c17的特性,并且允许我在c++14中使用它,只是一个警告吗?
是的。
在我的代码中使用它有什么坏处呢?
因为其他编译器可能不同意。* 相同 * 的编译器在新版本中可能不同意。
编译器倾向于这样做,以使标准库的实现更容易。他们可能希望将所有
if((int x = foo()))
形式的if
语句替换为if(int x = foo(); x)
。他们只需禁用其头文件中的警告。但是标准库实现是针对特定版本的编译器编写的,所以它们使用了编译器的细节,而其他人如果想编写可移植代码,就不能可靠地使用这些细节。如果你对依赖特定于编译器的行为没有意见,你可以使用这些细节。