Я пытаюсь использовать библиотеку поставщика в сочетании с моим 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?
