默认参数位于参数列表中间?

发布于 2024-10-31 23:46:11 字数 257 浏览 1 评论 0原文

我在代码中看到如下所示的函数声明,

void error(char const *msg, bool showKind = true, bool exit);

我首先认为这是一个错误,因为函数中间不能有默认参数,但编译器接受了此声明。有人见过这个吗?我正在使用GCC4.5。这是 GCC 扩展吗?

奇怪的是,如果我把它放在一个单独的文件中并尝试编译,GCC 会拒绝它。我已经仔细检查了所有内容,包括使用的编译器选项。

I saw a function declaration in our code that looked as follows

void error(char const *msg, bool showKind = true, bool exit);

I thought first that this is an error because you cannot have default arguments in the middle of functions, but the compiler accepted this declaration. Has anyone seen this before? I'm using GCC4.5. Is this a GCC extension?

The weird thing is, if I take this out in a separate file and try to compile, GCC rejects it. I've double checked everything, including the compiler options used.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

半衬遮猫 2024-11-07 23:46:11

如果在函数的第一个声明中,最后一个参数具有默认值,则该代码将起作用,如下所示:

//declaration
void error(char const *msg, bool showKind, bool exit = false);

然后在同一范围内您可以为其他参数提供默认值(从右侧) ),在后面的声明中,如:

void error(char const *msg, bool showKind = true, bool exit); //okay

//void error(char const *msg = 0 , bool showKind, bool exit); // error

可以称为:

error("some error messsage");
error("some error messsage", false);
error("some error messsage", false, true);

Online Demo : http://ideone.com/aFpUn

请注意,如果您提供第一个参数的默认值(从左开始),如果不提供第二个参数的默认值,它将无法编译(按预期): http://ideone .com/5hj46


§8.3.6/4 说,

对于非模板函数,默认
参数可以稍后添加
同一函数中的函数声明
范围。

标准本身的示例:

void f(int, int);
void f(int, int = 7);

第二个声明添加了默认值!

另请参阅§8.3.6/6。

That code would work if in the very first declaration of the function, the last parameter has default value, something like this:

//declaration
void error(char const *msg, bool showKind, bool exit = false);

And then in the same scope you can provide default values for other arguments (from right side), in the later declaration, as:

void error(char const *msg, bool showKind = true, bool exit); //okay

//void error(char const *msg = 0 , bool showKind, bool exit); // error

which can called as:

error("some error messsage");
error("some error messsage", false);
error("some error messsage", false, true);

Online Demo : http://ideone.com/aFpUn

Note if you provide default value for the first parameter (from left), without providing default value for the second, it wouldn't compile (as expected) : http://ideone.com/5hj46


§8.3.6/4 says,

For non-template functions, default
arguments can be added in later
declarations of a function in the same
scope.

Example from the Standard itself:

void f(int, int);
void f(int, int = 7);

The second declaration adds default value!

Also see §8.3.6/6.

牵你手 2024-11-07 23:46:11

答案可能在 8.3.6 中:

8.3.6 默认参数

6 类的成员函数除外
模板,默认参数
成员函数定义
出现在课堂之外
定义被添加到集合中
提供的默认参数
中的成员函数声明
类定义。默认参数
对于类的成员函数
模板应在
会员的初始声明
类模板中的函数。

示例:

<前><代码>C类{
无效 f(int i = 3);
无效 g(int i, int j = 99);
};
void C::f(int i = 3) // 错误:默认参数已经存在
{ } // 在类范围内指定
void C::g(int i = 88, int j) // 在这个翻译单元中,
{ } // C::g 可以不带参数调用

读完本文后,我发现 MSVC10 在关闭编译器扩展的情况下接受以下内容:

void error(char const* msg, bool showKind, bool exit = false);

void error(char const* msg, bool showKind = false, bool exit)
{
    msg;
    showKind;
    exit;
}

int main()
{
    error("hello");
}

The answer might be in 8.3.6:

8.3.6 Default Arguments

6 Except for member functions of class
templates, the default arguments in a
member function definition that
appears outside of the class
definition are added to the set of
default arguments provided by the
member function declaration in the
class definition. Default arguments
for a member function of a class
template shall be specified on the
initial declaration of the member
function within the class template.

Example:

class C {
void f(int i = 3);
void g(int i, int j = 99);
};
void C::f(int i = 3) // error: default argument already
{ } // specified in class scope
void C::g(int i = 88, int j) // in this translation unit,
{ } // C::g can be called with no argument

After reading this, I found that MSVC10 accepted the following with compiler extensions turned off:

void error(char const* msg, bool showKind, bool exit = false);

void error(char const* msg, bool showKind = false, bool exit)
{
    msg;
    showKind;
    exit;
}

int main()
{
    error("hello");
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文