我试图使用供应商的库与我的C++应用程序结合.库主要基于C,这通常不是extern "C"个选项的问题,但我遇到了C++编译器不接受的问题.

我将代码简化为以下示例文件.头球.h代表suppier库main中的标题.c/cpp是我自己的文件.我的实际应用程序是一个C++应用程序,所以我想让它与主程序一起工作.cpp.

头球.h(注意第u64 u64;行):

#ifndef HEADER_H
#define HEADER_H

#include <stdint.h>

typedef uint64_t u64;

union teststruct {
    u64 u64;
    struct {
        u64 x:32;
        u64 y:32;
    } s;
};

#endif

main.c:

#include <stdio.h>
#include "header.h"

int main() {
    union teststruct a;
    a.u64=5;
    printf("%x\n", a.u64);

    return 0;
}

主要的cpp(与main.c相同,但有额外的extern "C"条语句):

#include <stdio.h>

extern "C" {
#include "header.h"
}

int main() {
    union teststruct a;
    a.u64=5;
    printf("%x\n", a.u64);

    return 0;
}

使用以下行编译main.c

gcc -o test main.c

编译没有问题.但是,使用G+编译器使用命令编译C++版本

g++ -o test main.cpp

提供以下编译器错误:

In file included from main.cpp:12:0:
header.h:11:9: error: ‘u64’ does not name a type
         u64 x:32;
         ^
header.h:12:9: error: ‘u64’ does not name a type
         u64 y:32;
         ^

问题是,供应商对类型和变量名使用了相同的名称(u64),这似乎是一个坏主意,但gcc显然接受它.我不想更改库(即header.h),因为它非常大,这在代码中经常发生,我偶尔会得到更新.有没有办法让g++接受这种组合,或者有没有办法修改main.cpp使其编译without个更改头.H

推荐答案

teststruct定义C++中的作用域.您可以填写合格的id teststruct::u64.因此,名称查找的语言规则解释了这一点,允许类和联合的成员在外部范围中隐藏标识符.一旦引入u64 u64;,不合格u64就不能指全球::u64,只能指成员.而且成员不是一种类型.

在C union teststruct中,没有定义范围.该字段只能用于成员访问,因此永远不会发生冲突.因此,该字段不需要隐藏文件作用域类型标识符.

据我所知,您不可能为了轻松地解决这个问题而做任何事情.此库(完全有效的C库)不是有效的C++库.与它使用newtry作为变量名没有什么不同.它需要被改编.

C++相关问答推荐

librsvg rsvg_handle_get_dimensions获取像素大小与浏览器中的渲染大小没有不同

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

intellisense不工作,甚至已经下载了c/c++扩展

C语言中字符数组声明中的标准

手动矢量化性能差异较大

为什么C语言允许你使用var =(struct NAME){

为什么内核使用扩展到前后相同的宏定义?

ATmega328P EEPROM未写入

在编译时参数化类型定义

当输入负数时,排序算法存在问题

Char变量如何在不使用方括号或花括号的情况下存储字符串,以及它如何迭代到下一个字符?

限制不同类型的限定符

如何编写一个for循环来计算C中各项的总和?

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

这段代码用于在C中以相反的顺序打印数组,但它不起作用

try 查找带有指针的数组的最小值和最大值

不兼容的整数到指针转换传递';char';到类型';常量字符*

If语句默认为true

C23 中的 [[reproducible]] 和 [[unsequenced]] 属性是什么?什么时候应该使用它们?

无法在 C 中打开文本文件,我想从中读取文本作为数据并将其写入数组