我有一个用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;
}

目前我别无 Select ,只能在我当前的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合并而来的头文件.C中的名称是stdint.h.

您需要通过检测__cplusplus宏来有条件地包含正确的标题.您还需要这个宏来使用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

C++相关问答推荐

变量的const视图是否定义良好?

为什么这个C程序代码会产生以下结果?

Mbed TLS:OAEP的就地en—/decryption似乎不起作用'

如何在C宏中确定Windows主目录?

为什么在C中二维字符数组会有这样的行为?

这是一个合法的C Strdup函数吗?

CC2538裸机项目编译但不起作用

如何在下面的C代码中正确管理内存?

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

如何计算打印二叉搜索树时每行所需的空间?

编译器如何处理具有更复杂值的枚举?

在C++中父进程和子进程中的TAILQ队列同步问题

C代码可以在在线编译器上运行,但不能在Leetcode上运行

从BIOS(8086)中读取刻度需要多少?

程序对大输入给出错误答案

如何在MSVC中使用intSafe.h函数?

在C中打印指针本身

STM32:代码的执行似乎取决于它在闪存中的位置

gdb - 你能找到持有内部 glibc 锁的线程吗?

段错误try 访问静态字符串,但仅有时取决于构建环境