编写在C和C++中都能工作的结构代码
writing struct code that works both in C and in C++
我知道定义和使用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 st
、struct 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
编辑的结构体命名允许程序员使用person
或struct person
。因此,有一点灵活性(更不用说您不必在typedef
之后更改struct
中已经编写的代码。
- 如何使我的 sizeof sum 结构与空参数包一起工作
- sizeof 函数如何在带和不带位字段的结构上工作?(填充)
- 在下面的示例中,结构名称和函数如何工作?
- <string> 结构中的矢量无法正常工作
- 静态 constexpr 函数在模板结构中工作,但不能在结构中工作.为什么?
- 试图使模板用于C 中结构的元素工作
- 指向成员结构的指针如何工作
- 字频 strcmp 使用结构数组无限工作
- 这个 c++ 结构是如何工作的,我如何使用它
- 结构在C++中如何工作
- C++:无法使套接字、螺纹和结构工作
- cudaMemcpy 结构设备主机不工作
- 返回一个结构数组(部分工作)C++
- 现代C++.从继续执行的工作线程返回数据结构
- "within"结构 C/C++ 工作
- 此C/C 的结构初始化器如何使用足够的字段工作
- 如何与CUDA中的结构内部结构一起工作
- 结构是如何工作的
- 工作线程队列的这种变体是某种模式或通用结构吗?
- 基于PHP示例,与C 中数据结构一起工作的多态性示例