【问题标题】:Automatically modifying C library to be used by C++自动修改 C++ 使用的 C 库
【发布时间】:2021-05-01 05:39:47
【问题描述】:

我想做一个工具,自动将C 库包装在:

#ifdef __cplusplus
extern "C" {
#endif

但我对 什么 究竟需要用extern "C" 包裹,而什么不需要包裹感到困惑。只有功能?任何 (shock-horror) 全局变量呢?还有什么?

如果我编写一个脚本,只查找所有函数并用extern "C" 包装它们,就够了吗?

最后:如果库已经用extern "C" 包装了它的函数,然后它们又被包装了,我可以相信没有任何不好的事情发生并且它仍然可以正常工作,还是我需要明确检查这一点?

【问题讨论】:

标签: c++ c


【解决方案1】:

没关系,因为任何不需要它的东西(例如宏和 cmets)都不会受到它的影响,因此您可以只包装整个标题内容 - 这几乎不需要“工具”。

也不是这不是“修改库”,只是修改了头部。

嵌套包装是良性的 - 将 C 链接应用于已经拥有它的东西没有效果。

extern "C" 所做的是告诉 C++ 编译器不要对指定符号应用名称修饰,因为它具有 C 链接,并且库中的相应名称具有 C 链接,而 不是 名称混乱。

名称修改是 C++ 将元数据应用于符号以提供类型信息和参数计数以支持需要此信息的 C++ 功能(例如函数重载)的方法。

【讨论】:

    【解决方案2】:

    查看此答案here 部分相关。

    你基本上只想:

    1. 自动包装一个包含,即extern "C" { #include <foo.h> }

    2. 自动包装被 include 包含的 C 头文件(因此,在“foo.h”的开头,而不是 include 语句本身)

    就双重包装的extern "C"s 而言,我使用这些文件对其进行了测试:

    lib.h:

    #pragma once
    #ifdef __cplusplus
    extern "C" {
    #endif
        void printHWorld(void);
    #ifdef __cplusplus
    }
    #endif
    
    

    lib.c:

    #include <stdlio.h>
    #include <lib.h>
    
    void printHWorld(void) {
        printf("Hello, world!\n");
    }
    

    main.cpp:

    #ifdef __cplusplus
    extern "C" {
    #endif
        #include <lib.h>
    #ifdef __cplusplus
    }
    #endif
    
    int main(void) {
        printHWorld();
        return 0;
    }
    

    然后我使用以下命令构建它:

    gcc -Wall -O2 -I. -o lib.o -c lib.c

    g++ -Wall -O2 -I. -o main.o -c main.cpp

    g++ -o test main.o lib.o

    而且效果很好,所以我认为您不必担心双重extern "C"

    【讨论】:

    • 感谢您的回答!我很难理解你答案的第一部分。我只是将 C 文件名包装在 C++ 代码中的包含点?所以我不需要修改C库?而且我不需要包装函数?请您解释得更清楚些 - 谢谢!
    • @Alasdair 根据我链接到的另一个问题的答案之一,您可以这样做:extern "C" { #include "library_file.h" }
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2013-10-12
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2015-10-28
    相关资源
    最近更新 更多