在 Stroustrup 的The C++ Programming Language: Special Edition (3rd Ed)中,Stroustrup 写道,不仅允许,而且鼓励在控制语句的条件中声明和初始化变量。他写道,他鼓励这样做,因为它将变量的范围缩小到只有它们需要的范围。所以像这样的事情......
if ((int i = read(socket)) < 0) {
// handle error
}
else if (i > 0) {
// handle input
}
else {
return true;
}
...是良好的编程风格和实践。该变量i
仅存在于if
需要它的语句块,然后超出范围。
但是,g++(Ubuntu 4.3.3 版特定编译)似乎不支持该编程语言的这一特性,这让我很惊讶。也许我只是用一个关闭它的标志调用 g++(我调用的标志是-g
and -Wall
)。使用这些标志编译时,我的 g++ 版本返回以下编译错误:
socket.cpp:130: error: expected primary-expression before ‘int’
socket.cpp:130: error: expected `)' before ‘int’
在进一步的研究中,我发现我似乎并不是唯一一个拥有不支持此功能的编译器的人。这个问题似乎有些混淆,究竟什么语法在语言中应该是标准的,什么编译器用它编译。
所以问题是,哪些编译器支持这个特性,需要设置哪些标志才能编译?这是在某些标准中而不是在其他标准中的问题吗?
另外,出于好奇,人们普遍同意 Stroustrup 认为这是一种好的风格吗?或者这是一种语言的创造者在他的脑海中产生一个不一定得到语言社区支持的想法的情况?