【发布时间】:2010-12-03 18:24:55
【问题描述】:
在 Stroustrup 的C++ 编程语言:特别版(第 3 版)中,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 和-Wall)。使用这些标志编译时,我的 g++ 版本返回以下编译错误:
socket.cpp:130: error: expected primary-expression before ‘int’
socket.cpp:130: error: expected `)' before ‘int’
在进一步的研究中,我发现我似乎并不是唯一一个使用不支持此功能的编译器的人。在this question 中似乎存在一些混淆,即究竟什么语法在该语言中应该是标准的,以及编译器用它编译什么。
所以问题是,哪些编译器支持此功能,需要设置哪些标志才能编译?是否符合某些标准而不符合其他标准?
另外,出于好奇,人们是否普遍同意 Stroustrup 认为这是一种好的风格?或者这是一种语言的创造者在他的脑海中产生了一个不一定得到该语言社区支持的想法的情况?
【问题讨论】:
-
我不知道哪个编译器支持它,但我个人每次做任何不需要该变量的事情时都会使用这种方法,除了将其用作临时变量。不过同样的问题,这是不好的做法吗?
-
我认为按块确定变量范围的整个想法是不好的做法,因为它可以原谅长方法。我推荐 Bob Martin 在他非常有用的著作Clean Code 中关于函数长度的激进主张;具体来说,一个方法实际上不应该有多个控制结构。
标签: c++ compiler-construction conditional declaration