从 C 文件调用 C++ 标准头文件 (cstdint)

Calling C++ standard header (cstdint) from C file

提问人:LPo 提问时间:5/10/2022 更新时间:5/10/2022 访问量:968

问:

我有一个用 C++ 编写的外部库,例如

外部.h

#ifndef OUTPUT_FROM_CPP_H
#define OUTPUT_FROM_CPP_H

#include <cstdint>
extern "C" uint8_t myCppFunction(uint8_t n);

#endif

外部.cpp

#include "external.h"
uint8_t myCppFunction(uint8_t n)
{
    return n;
}

目前我别无选择,只能在我当前的 C 项目中使用这个 C++ 库。但我的编译器告诉我

No such file or director #include <cstdint>

在我的 C 项目中使用时

main.c

#include "external.h"

int main()
{
    int a = myCppFunction(2000);

    return a;
}

我知道这是因为 cstdint 是我尝试通过我的 C 文件使用的 C++ 标准库。

我的问题是:

  • 有没有办法在不修改库的情况下在我的 C 项目中管理使用此 C++ 库?
  • 如果没有,我必须在图书馆方面做些什么才能使之成为可能?
C C C++标准库 混合

评论


答:

2赞 Some programmer dude 5/10/2022 #1

中的前缀是因为它实际上是从 C 合并的头文件。C 中的名称是 。ccstdintstdint.h

您需要通过检测宏有条件地包含正确的标头。您还需要此宏来使用该部分,因为它特定于 C++:__cplusplusextern "C"

#ifndef OUTPUT_FROM_CPP_H
#define OUTPUT_FROM_CPP_H

#ifdef __cplusplus
// Building with a C++ compiler
# include <cstdint>
extern "C" {
#else
// Building with a C compiler
# include <stdint.h>
#endif

uint8_t myCppFunction(uint8_t n);

#ifdef __cplusplus
}  // Match extern "C"
#endif

#endif

评论

0赞 Andrew Henle 5/10/2022
这是唯一的答案(在我写这篇文章时),既不需要为 C 和 C++ 创建单独的头文件,因此会造成长期维护的麻烦,其中两个文件必须保持同步;或强制 C++ 代码依赖于而不是 - 这两个标头并不完全等效stdint.hcstdint
0赞 HolyBlackCat 5/10/2022 #2

您必须修改库。

替换为 .通常建议使用前者,但 C 中仅存在后者。<cstdint><stdint.h>

您还应该在 上收到错误。通过将以下内容放在包含的正下方来解决:extern "C"

#ifdef __cplusplus
extern "C" {
#endif

在文件末尾有一个匹配的部分:

#ifdef __cplusplus
}
#endif

然后可以从各个函数中删除。extern "C"

0赞 KamilCuk 5/10/2022 #3

有没有办法在不修改库的情况下在我的 C 项目中管理使用此 C++ 库?

创建一个可使用 C 移植的单独标头,并在使用 C 编译器编译时使用该标头:

// external_portable_with_c.h
// rewrite by hand or generate from original external.h
// could be just sed 's/cstdint/stdint.h/; s/extern "C"//'
#include <stdint.h>
uint8_t myCppFunction(uint8_t n);
 
// c_source_file.c
#include "external_portable_with_c.h"
void func() {
    myCppFunction(1);
}

如果没有,我必须在图书馆方面做些什么才能使之成为可能?

由其他答案回答。使用 保护 C++ 部件。#ifdef __cplusplus

请注意,(一些?全部?)编译器要求使用 C++ 编译器编译函数,以便 C++ 和 C 正常工作。https://isocpp.org/wiki/faq/mixing-c-and-cpp#overview-mixing-langsmain

0赞 VLL 5/10/2022 #4

如果不想修改库标头,请创建一个新文件,例如包含内容includes_for_cpp/cstdint

#include <stdint.h>

将目录添加到 C 项目的 include 路径中。之后,应该找到您的文件。includes_for_cpp#include <cstdint>