gpt4 book ai didi

c++ - 编译器未捕获默认参数中的细微语法错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:00 25 4
gpt4 key购买 nike

我开始收到错误,“错误 C2059:语法错误:‘默认参数’”,这行代码声明了一个函数,该函数的字符串参数被赋予了默认参数。这显然有点令人沮丧,因为错误消息并不完全具有启发性(我知道这是一个“默认参数”!),并且确切的声明可以在其他地方使用。

稍微改变一下声明后,我发现它在包含类中的位置实际上有影响。缩小范围,我发现我在声明一个不同的函数时有些错误,因为在它的默认参数之一之后包含了一个分号。编译器似乎对此非常满意,这似乎有点奇怪。我进行了更多调查,并提出了以下测试用例,试图找出发生的事情的本质:

enum TestEnum1
{
TEST_ONE
};
class TestClass
{
public:
enum TestEnum2
{
TEST_TWO,
TEST_THREE,
TEST_FOUR
};
void Func1( int iParm = TEST_ONE; ); // additional semicolon here
void Func2( std::string strParm = "" );
};

如上面的代码所示,Func2 将产生我上面提到的编译错误。如果我将 Func2 移动到 Func1 之上,那么一切都可以正常编译。

如果我将 Func1 中的默认参数切换为显式数字或使用在 TestClass 中声明的枚举,那么我会收到该行的预期语法错误。

从本质上讲,奇怪的事情似乎是,如果我将默认参数的值设置为枚举未直接在当前类中定义并且我有点太喜欢分号了,编译器将忽略语法错误,直到其他一些看似无关的事情最终导致解析器以一种非常神秘的方式死掉。

我是不是完全错过了什么?这是预期的行为吗?当然,我很犹豫是否将其称为编译器中的错误,但这似乎不太正确。如果只是我对标准有一些误解,那么我想知道我哪里错了。

最佳答案

我想说这不完全是编译器中的错误,因为编译器无法解析代码是以一种意想不到的方式表达的。

当编译器碰到那个错误的分号时,它认为它知道一些不应该是真的代码。在到达第二个函数的默认参数之前,编译器认为没有任何东西与这种信念相矛盾,这显然与它认为代码在语法上所处的状态不相符。它在那里调用错误,因为它在那里看到了问题,但它不能保证那是代码问题的实际所在。

这是我经常看到的错位或遗漏花括号、圆括号或其他定界括号的情况。编译器认为一切都很好,直到它到达代码块的末尾并意识到左右括号的数量不同,所以在那里调用错误。它实际上无法判断丢失的支架应该去哪里。

因为此行为取决于所使用的确切解析过程,所以它依赖于编译器。然而,虽然这通常会改变调用的错误类型和位置,但它通常是每个编译器上的某种错误。

关于c++ - 编译器未捕获默认参数中的细微语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3105265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com