在函数签名中指定结构

Specifying struct in function signature

提问人:Luchian Grigore 提问时间:9/8/2011 最后编辑:iammilindLuchian Grigore 更新时间:9/8/2011 访问量:2111

问:

说我有

struct mystruct
{
};

两者之间有区别吗:

void foo(struct mystruct x){}

void foo(mystruct x){}

?

C++ 结构 函数签名

评论


答:

3赞 Kerrek SB 9/8/2011 #1

没有区别。后者是正确的 C++ 语法;前者是允许作为恢复 C 程序员的遗留变体。

请注意,和本质上是相同的,并且都定义了一个类,因此 C++ 中没有对 C 样式 POD 结构进行特殊处理。structclass

[编辑:显然有一点差异,请看Mark B的出色回答。

11赞 Mark B 9/8/2011 #2

在 C 语言中,后者是无效的。

但是,在 C++ 中,它们几乎相同:如果您尚未声明结构,第一个将有效,它会将其视为参数的正向声明。

评论

1赞 Kerrek SB 9/8/2011
啊,隐式的正向声明是一个很好的微妙之处!+1
7赞 Steve Jessop 9/8/2011 #3

不在您编写的代码中。据我所知,使用带和不带定义的类名之间的唯一区别如下:struct

struct mystruct
{
};

void mystruct() {}

void foo(struct mystruct x){} // compiles
void foo(mystruct x){} // doesn't - for compatibility with C "mystruct" means the function

因此,不要定义与类同名的函数。

评论

0赞 Kerrek SB 9/8/2011
阴险 - 从什么时候开始,您可以拥有与类型同名的函数?
0赞 Steve Jessop 9/8/2011
@Kerrek:与结构体同名,因为K&R C.结构体占用的命名空间与typedefs和函数不同。IIRC 引入的 C++ 在没有前缀的情况下使用的方式实际上并不是通过类型定义它,只是在某处有一个名称解析规则,说如果您在范围内找不到名称,请在进入下一个范围之前检查该范围内的结构。mystructstruct
0赞 Luchian Grigore 9/8/2011
很好,不知道你能做到。谢谢!