从 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 文件使用它。

我的问题是:

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> 应该会找到您的文件。