命名空间作用域下的if语句是否合规?Clang支持是否为扩展?
全局作用域中使用if语句的C++语法兼容性问题
以下是测试用的C++代码:
#include <utility> #include <cmath> extern "C" int printf(const char*,...); std::pair<double, double> sincos(double s) { return {std::sin(s), std::cos(s)}; } void g(double a, double b) { printf("sin(a)=%f; cos(b)=%f\n", a, b); } auto [a,b] = sincos(30); if (a < b) // <---- 此处为全局作用域的if语句 g(a,b); int main() { }
问题说明
这段代码在全局(命名空间)作用域中直接使用了if语句,按标准C++语法这是不被允许的,但Clang编译器却能正常编译通过,想咨询:该写法是否为Clang的扩展?若为扩展,是否有相关文档说明?
解答
标准C++明确规定,命名空间作用域(包括全局作用域)只能包含声明或定义(比如变量、函数、类/模板的定义等),不能直接放置if、函数调用这类可执行语句。
你遇到的情况是Clang的全局语句(Global Statements)扩展导致的——该扩展属于Clang对GNU语法的兼容特性(GCC同样支持此特性),默认是开启状态,允许在全局/命名空间作用域中直接编写执行语句。
如果想要强制遵循标准C++语法,禁用该扩展,可以在编译时添加-pedantic-errors选项,此时Clang会抛出语法错误,拒绝编译这段代码。该扩展的详细说明可在Clang官方文档的GNU兼容扩展章节中找到。
内容的提问来源于stack exchange,提问作者Andrew Tomazos
相关产品推荐
相关产品推荐

