gpt4 book ai didi

c++ - 外部 "C": What does and what doesn't need it?

转载 作者:太空狗 更新时间:2023-10-29 23:48:41 27 4
gpt4 key购买 nike

函数上已经有关于extern "C" 的问题,但是这个问题试图将它扩展到其他东西,比如变量等等。

如果我有一个 foo.hpp header 来使用来自 C++ 的 foo.c 文件,我制作了这个模板,并为这个问题填充了简单的示例:

/******************************************************************************
******* include guard { ******************************************************
******************************************************************************/
#ifndef FOO_HPP
#define FOO_HPP


/******************************************************************************
******* headers **************************************************************
******************************************************************************/
#include <cstdbool>
#include <cstddef>
#include <cstdint>


/******************************************************************************
******* typedefs *************************************************************
******************************************************************************/
/* `#if !defined(UINT128_MAX)` is to test if uint128_t already exists */
#if !defined(UINT128_MAX)
typedef __uint128_t uint128_t;
typedef __int128_t int128_t;
#endif


/******************************************************************************
******* macros ***************************************************************
******************************************************************************/
#if !defined(UINT128_MAX)
#define UINT128_MAX (~((uint128_t)0))
#endif
#if !defined(INT128_MAX)
#define INT128_MAX ((int128_t)(UINT128_MAX >> 1))
#endif
#if !defined(INT128_MIN)
#define INT128_MIN ((int128_t)(-INT128_MAX - 1))
#endif


/******************************************************************************
******* enums ****************************************************************
******************************************************************************/
enum Some_Enum {
SOME_CONSTANT_A,
SOME_CONSTANT_B,

SOME_CONSTANT_C
};


/******************************************************************************
******* structs / unions *****************************************************
******************************************************************************/
union Some_Union {
int128_t a;
int64_t b[SOME_CONSTANT_C];
};

struct Some_Struct {
union Some_Union a;
bool b;
};


/******************************************************************************
******* static const variables ***********************************************
******************************************************************************/
static const struct Some_Struct x = {
.a = {
.b = {
[SOME_CONSTANT_A] = 0,
[SOME_CONSTANT_B] = 1
}
},
.b = true
};


/******************************************************************************
******* C wrapper { **********************************************************
******************************************************************************/
extern "C" {


/******************************************************************************
******* extern variables *****************************************************
******************************************************************************/
extern union Some_Union y;


/******************************************************************************
******* extern functions *****************************************************
******************************************************************************/
int foo(size_t n, int128_t arr[restrict]);


/******************************************************************************
******* } C wrapper **********************************************************
******************************************************************************/
} /* extern "C" */


/******************************************************************************
******* static inline functions (prototypes) *********************************
******************************************************************************/
static inline int compare_ldbl(const void *a_p, const void *b_p);


/******************************************************************************
******* static inline functions (definitions) ********************************
******************************************************************************/
static inline int compare_ldbl(const void *a_p, const void *b_p)
{
long double a = *(long double *)a_p;
long double b = *(long double *)b_p;

if (a < b)
return -1;
else if (a > b)
return 1;
else
return 0;
}


/******************************************************************************
******* } include guard ******************************************************
******************************************************************************/
#endif /* foo.hpp */


/******************************************************************************
******* end of file **********************************************************
******************************************************************************/

所有类型、宏、enumstructunionextern 变量和函数应该与 C 兼容(尽可能)。只有 static 的东西可以表现不同,因为我可以在 header 中针对 C++ 调整它们。

这是放置 C 包装器的正确位置吗?

最佳答案

虽然它也做其他事情,但 extern "C" 的要点是禁止 name mangling .

名称重整主要用于两件事:

  1. 函数重载
  2. 允许不同范围内的同名符号

由于所有全局(非命名空间)结构、枚举、类型和变量都不能重载,因此它们不需要名称重整,因此不需要 extern "C"。实际上只有全局(非命名空间)函数才需要它。

关于c++ - 外部 "C": What does and what doesn't need it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55183153/

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