提问人:LPo 提问时间:5/10/2022 更新时间:5/10/2022 访问量:968
从 C 文件调用 C++ 标准头文件 (cstdint)
Calling C++ standard header (cstdint) from C file
问:
我有一个用 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
cstdint
stdint.h
您需要通过检测宏有条件地包含正确的标头。您还需要此宏来使用该部分,因为它特定于 C++:__cplusplus
extern "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
评论
stdint.h
cstdint
您必须修改库。
替换为 .通常建议使用前者,但 C 中仅存在后者。<cstdint>
<stdint.h>
您还应该在 上收到错误。通过将以下内容放在包含的正下方来解决:extern "C"
#ifdef __cplusplus
extern "C" {
#endif
在文件末尾有一个匹配的部分:
#ifdef __cplusplus
}
#endif
然后可以从各个函数中删除。extern "C"
有没有办法在不修改库的情况下在我的 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
如果不想修改库标头,请创建一个新文件,例如包含内容includes_for_cpp/cstdint
#include <stdint.h>
将目录添加到 C 项目的 include 路径中。之后,应该找到您的文件。includes_for_cpp
#include <cstdint>
评论