【发布时间】:2018-12-06 06:04:23
【问题描述】:
我正在尝试将供应商的库与我的 C++ 应用程序结合使用。该库主要基于 C,这通常不是 extern "C" 选项的问题,但我遇到了 C++ 编译器不接受的问题。
我将代码简化为以下示例文件。 header.h 代表来自 suppier 库的头文件,main.c/cpp 是我自己的文件。我真正的应用程序是一个 C++ 应用程序,所以我想让它与 main.cpp 一起工作。
header.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;
}
main.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 以使其编译而不更改 header.h?
【问题讨论】:
-
C 和 C++ 是两种截然不同的语言,具有非常不同的规则和语义。有很多东西是有效的 C 但无效的 C++。如果您的头文件包含有效的 C 但无效的 C++,并且您无法真正编辑头文件以“修复”它,那么您自己也无能为力。而
extern "C"并不是真正的“C 向后兼容模式”,它的主要用途是禁止名称修改,仅此而已。 -
向您的图书馆供应商提交错误报告。
-
该库是否声称可用于 C++ 代码?还是只声称是C代码?
-
@Someprogrammerdude 答案和评论是两个非常不同的概念,有着非常不同的规则。有很多东西是有效的 cmets,但问题的答案不是其中之一。