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