我知道有两种可能的方法来定义和使用struct
s:
#1
struct person
{
char name[32];
int age;
};
struct person dmr = {"Dennis Ritchie", 70};
#2
typedef struct
{
char name[32];
int age;
} person;
person dmr = {"Dennis Ritchie", 70};
第一种方式的有趣属性是类型和变量都可以具有相同的名称:
struct person person = {"Sam Persson", 50};
这是C中的惯用语吗?它可以保证在C ++中工作吗?或者我应该注意哪些角落?
请注意,我对纯C ++答案不感兴趣(例如“使用std::string
代替char[32]
”。这是一个关于C / C ++兼容性的问题。
答案 0 :(得分:3)
struct
兼容C& C ++只有在POD - s。
我倾向于编写类似的代码:
struct person_st { char name[32]; int age; };
typedef struct person_st Person_t;
答案 1 :(得分:2)
我声明它们在struct标记和全局标识符命名空间中具有相同的名称:
#ifdef __cplusplus
extern "C" {
#endif
typedef struct person
{
char name[32];
int age;
} person;
#ifdef __cplusplus
}
#endif
在使用中,不需要在C和C ++翻译中使用struct标记:
person dmr = {"Dennis Ritchie", 70};
如果你喜欢某些地方的结构标签,你也可以这样使用它。
显而易见的好处是,无论语言如何,两个名称空间中的标识符都可以引用该类型。
答案 2 :(得分:1)
struct person person = {"Sam Persson", 50};
对类型和变量使用相同的标识符并不惯用。在Unix中,通常使用缩写版本作为变量名称,例如:struct stat st
,struct timeval tv
,......同样的方式fd
是文件描述符变量的典型名称
答案 3 :(得分:0)
我不确定它在标准C ++中是否完全正确,但是我使用g++ -pedantic -Wall
测试并且没有错误或警告(请注意,这并不一定意味着它完全是标准的.g ++,即使是-pedantic,没有经历为所有非标准代码发出警告的麻烦。)(有人知道c ++规范是否足以评论它是否真的是标准的?)
写作的东西:
struct person person = {...};
是在C ++中,person
都指变量和类型。在C中,这不是一个问题,因为person
不是类型(struct person
是)。虽然从上下文来看,我用g ++编写的少量测试,编译器在我要求变量的时候没有问题,而在类型的时候,我认为它可能会在某些时候混淆。我发现的一件令人困惑的事情是,如果你有:
struct person *person = ...;
然后sizeof(person)
返回变量的大小,而要获得类型的大小,你应该写sizeof(struct person)
我可以向你保证,没有c ++编码器会记得写{{1 }}
最好避免各种混淆。我通常这样做的代码可以在C和C ++中使用:
stuct
为typedef struct person
{
...
} person;
编辑的结构命名允许程序员使用typedef
或person
。所以,有点灵活性(更不用说在struct person
typedef
之后你不必改变已编写的代码。