clang++/g++对int*=0参数编译报错是否为Bug?
这是预期行为,而非编译器Bug
咱们先把问题里的场景明确下来:
报错的原代码
void function(int*=0) {} int main() { }
不同编译器的错误提示
- Clang 3.8.0编译错误:
test.cc:1:18: error: expected ')' void function(int*=0) { ^ - GCC 5.4.0编译错误:
test.cc:1:18: error: expected ‘,’ or ‘...’ before ‘=’ token void function(int*=0) { ^
修改后可正常编译的代码(注意空格)
void function(int* = 0) {} int main() { }
背后的原因:C++词法解析的「最长匹配」规则
这一切的核心是C++编译器的词法分析阶段遵循最长匹配原则:编译器会尽可能地将连续的字符解析成一个完整的语法符号(token)。
当你写int*=0的时候,编译器会把*=识别成一个复合赋值运算符(就像+=、-=这类),而不是把*单独当成指针类型的修饰符,再把=当成默认参数的标记。这样一来,原代码的参数声明就变成了int + 运算符*= + 0,完全不符合函数参数的语法结构,自然会抛出语法错误。
而当你在*和=之间加了空格后,词法分析器会把它们拆成两个独立的token:*作为指针类型修饰符,=作为默认参数的赋值符号,这就完全符合C++的语法规则了,编译器自然能正常处理。
所有符合C++标准的编译器都会遵循这个词法解析规则,所以这并不是编译器的Bug,而是完全符合预期的行为。
内容的提问来源于stack exchange,提问作者gct
相关产品推荐
相关产品推荐

