使用“struct”关键字进行结构体实例化

5

假设我声明一个新的 C++ 结构体类型:

struct my_struct {
   int a;
   int b;
};

我可以通过以下方式创建此结构类型的新实例吗:

my_struct foo;

或者

struct my_struct foo;

如果两者都能工作,是否有任何区别?
2个回答

15

是的,你可以使用任意一种方法。两者的区别在于这种形式:

my_struct foo;

这种写法在C语言中是不合法的,所以你必须使用下面这种形式:

struct my_struct foo;

这是为了与C向后兼容而在C++中支持的。


1
不仅是为了向后兼容,这两者略有不同,并且在某些情况下需要使用 struct(或 class)。尽管可以说这种情况确实很少。 - David Rodríguez - dribeas
1
@DavidRodríguez-dribeas:您能详细说明一下吗? - Martin York
@Loki Astari: struct test {}; void test() {} int main() { struct test t; } 如果在 main 函数中没有 struct(或 class)关键字,那么标识符 test 将指向函数 test 而不是类型 test。不可否认的是,将类型和函数命名为相同名称的人存在问题,但在具有命名空间、使用声明、使用指令和参数相关查找[*]的语言中,查找结果并不总是显而易见的。如果存在 struct 关键字,则查找将跳过非用户定义类。 - David Rodríguez - dribeas
[*]: ADL对这个特定情况没有影响,但它是另一个使得确定编译器找到了什么变得困难的特性案例。因此,如果我要抱怨查找的复杂性,我可能会将其提出来 :) - David Rodríguez - dribeas

3

两种方法都可以。第二种方法的主要原因是与C语言的兼容性:在C语言中,第一种方法不起作用。因此,在C语言中,通常会使用typedefstruct进行重命名,并且有两种不同的名称用于structtypedef


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接