从 C 文件调用 C++ 标准头文件 (cstdint)
Calling C++ standard header (cstdint) from C file
我有一个用 C++ 编写的外部库,例如
external.h
#ifndef OUTPUT_FROM_CPP_H
#define OUTPUT_FROM_CPP_H
#include <cstdint>
extern "C" uint8_t myCppFunction(uint8_t n);
#endif
external.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++ 库而不修改我的库?
- 如果不能,我需要在图书馆方面做什么才能使之成为可能?
cstdint
中的c
前缀是因为它确实是一个从C合并而来的header文件,C中的名字是stdint.h
.
您需要通过检测 __cplusplus
宏来有条件地包含正确的 header。您还需要这个宏来使用 extern "C"
部分,因为它是特定于 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
你必须修改库。
将 <cstdint>
替换为 <stdint.h>
。通常推荐前者,但C中只有后者存在
您也应该在 extern "C"
上遇到错误。这可以通过将以下内容放在包含的正下方来解决:
#ifdef __cplusplus
extern "C" {
#endif
在文件末尾有一个匹配部分:
#ifdef __cplusplus
}
#endif
然后extern "C"
可以从个别函数中删除。
Is there a way I can manage to use this C++ library in my C project without modifying my libary ?
创建一个 单独的 头文件,它可以与 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);
}
If no, what whould I have to do on the library side to make it possible ?
被其他答案回答。使用 #ifdef __cplusplus
.
保护 C++ 部分
请注意(部分?全部?)编译器需要 main
函数使用 C++ 编译器编译,以便 C++ 和 C 能够正常协同工作。 https://isocpp.org/wiki/faq/mixing-c-and-cpp#overview-mixing-langs
如果不想修改库头,新建一个文件,例如includes_for_cpp/cstdint
with content
#include <stdint.h>
将目录 includes_for_cpp
添加到 C 项目的包含路径中。之后,#include <cstdint>
应该会找到您的文件。
我有一个用 C++ 编写的外部库,例如
external.h
#ifndef OUTPUT_FROM_CPP_H
#define OUTPUT_FROM_CPP_H
#include <cstdint>
extern "C" uint8_t myCppFunction(uint8_t n);
#endif
external.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++ 库而不修改我的库?
- 如果不能,我需要在图书馆方面做什么才能使之成为可能?
cstdint
中的c
前缀是因为它确实是一个从C合并而来的header文件,C中的名字是stdint.h
.
您需要通过检测 __cplusplus
宏来有条件地包含正确的 header。您还需要这个宏来使用 extern "C"
部分,因为它是特定于 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
你必须修改库。
将 <cstdint>
替换为 <stdint.h>
。通常推荐前者,但C中只有后者存在
您也应该在 extern "C"
上遇到错误。这可以通过将以下内容放在包含的正下方来解决:
#ifdef __cplusplus
extern "C" {
#endif
在文件末尾有一个匹配部分:
#ifdef __cplusplus
}
#endif
然后extern "C"
可以从个别函数中删除。
Is there a way I can manage to use this C++ library in my C project without modifying my libary ?
创建一个 单独的 头文件,它可以与 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);
}
If no, what whould I have to do on the library side to make it possible ?
被其他答案回答。使用 #ifdef __cplusplus
.
请注意(部分?全部?)编译器需要 main
函数使用 C++ 编译器编译,以便 C++ 和 C 能够正常协同工作。 https://isocpp.org/wiki/faq/mixing-c-and-cpp#overview-mixing-langs
如果不想修改库头,新建一个文件,例如includes_for_cpp/cstdint
with content
#include <stdint.h>
将目录 includes_for_cpp
添加到 C 项目的包含路径中。之后,#include <cstdint>
应该会找到您的文件。