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

writing struct code that works both in C and in C++

本文关键字:工作 结构 代码 C++      更新时间:2023-10-16

我知道定义和使用struct的两种可能方法:

#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++兼容性的问题。

struct在C&C++仅当它们是POD时。

我倾向于编写以下代码:

struct person_st { char name[32]; int age; };
typedef struct person_st Person_t;

我声明它们在结构标记和全局标识符命名空间中都有相同的名称:

#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};

如果您在某些地方更喜欢struct标记,也可以这样使用它。

明显的好处是,无论语言如何,类型都可以由两个名称空间中的任一标识符引用。

struct person person = {"Sam Persson", 50};

对类型和变量使用相同的标识符是不习惯的。在Unix中,通常使用缩写版本作为变量名,例如:struct stat ststruct timeval tv。。。CCD_ 7是文件描述符变量的典型名称。

我不确定它在标准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++编码器会记得写stuct

最好避免各种混淆。我通常这样做是为了可以在C和C++中使用的代码:

typedef struct person
{
    ...
} person;

为正在进行typedef编辑的结构体命名允许程序员使用personstruct person。因此,有一点灵活性(更不用说您不必在typedef之后更改struct中已经编写的代码。