gpt4 book ai didi

c++ - 条件 C/C++ 结构定义

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:11:21 25 4
gpt4 key购买 nike

我偶然发现了一些看起来像这样的代码:

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 部分都没有任何内容,如上所示。

最佳答案

这并不完全违反 ODR。通俗地说,C 编译器看到一个 POD 类型,而 C++ 编译器看到全局命名空间中的一个类,它将成为一个名称被破坏的实体。更重要的是,该结构仅针对 C 和 C++ 编译器以不同方式声明,但它仅在 C++ 源文件中定义一次。 C++ 源文件中很可能存在一些分配和自由函数,这些函数将构造函数/析构函数公开给 C API。例如,

头文件

$ cat some_struct.h 
#ifndef SOME_STRUCT_H
#define SOME_STRUCT_H

typedef struct SomeStruct {
int foo;
void *var;
#if defined(__cplusplus)
SomeStruct();
#endif
} SomeStruct;

#if defined(__cplusplus)
extern "C" {
#endif

SomeStruct *some_struct_malloc();
void some_struct_free(SomeStruct **);

#if defined(__cplusplus)
} // extern "C"
#endif

#endif // SOME_STRUCT_H

C++源文件

$ cat some_struct.cpp 
#include "some_struct.h"
#include <cstddef>

SomeStruct::SomeStruct()
{
foo = 10;
var = NULL;
}

SomeStruct *some_struct_malloc() { return new SomeStruct; }

void some_struct_free(SomeStruct **pp)
{
if (*pp)
delete *pp;
*pp = NULL;
}

C源文件:

$ cat main.c 
#include "some_struct.h"
#include <stdio.h>

int main()
{
SomeStruct *p = some_struct_malloc();
printf("%d\n", p->foo);
}

我会说这是一种糟糕的风格。但它可以作为一种将 C++ 库公开给 C API 的便捷方式

关于c++ - 条件 C/C++ 结构定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40961332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com