编写在C和C ++中都能工作的结构代码

时间:2011-10-29 08:59:33

标签: c++ c struct compatibility typedef

我知道有两种可能的方法来定义和使用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 ++兼容性的问题。

4 个答案:

答案 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 ststruct 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; 编辑的结构命名允许程序员使用typedefperson。所以,有点灵活性(更不用说在struct person typedef之后你不必改变已编写的代码。