【发布时间】:2016-12-04 17:19:30
【问题描述】:
我偶然发现了一些看起来像这样的代码:
typedef struct SomeStruct
{
int foo;
void * bar;
#if defined(__cplusplus)
SomeStruct();
#endif
} SomeStruct;
它位于 .c 和 .cpp 文件都将包含的头文件中。这似乎至少在技术上违反了单一定义规则。我看到的明显影响是,如果在 .c 文件中声明了其中之一,则构造函数将不会运行。不幸的是,似乎有人将其用作声明结构的正确方法的模式,并且已经声明了几十个类似的结构。
我正试图弄清楚这是一个多么严重的问题。除了构造函数可能没有运行之外,还有其他可能的影响吗?构造函数在 .cpp 文件中实现。我看到了指向在 .c 文件(带有 malloc)中分配的结构的指针,这些结构被传递给 .cpp 文件中的函数。据我所知,它们似乎工作正常(使用 gcc/g++ 4.6.2 为 Suse Linux 编译,如果这很重要)。如果还添加了虚拟成员函数,会有什么问题吗?目前,这些类的 cplusplus 部分中除了默认构造函数之外没有任何内容,如上所示。
【问题讨论】:
-
虚函数肯定会破坏代码。它们需要结构内部的额外存储空间(所谓的 vtable 指针)。
-
在
struct的开头添加char* empty;可能会帮助您添加虚函数,尽管这是一个非常可怕的解决方案
标签: c++ c gcc struct one-definition-rule