Я пытаюсь использовать библиотеку поставщика в сочетании с моим 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"
выражением 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
компилируется без проблем. Однако компиляция версии C++ с использованием компилятора g++ с командой
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?