Je suis en train d'utiliser un fournisseur de la bibliothèque en combinaison avec mon application C++. La bibliothèque est en grande partie basé sur le C, qui n'est normalement pas un problème avec l' extern "C"
option, mais j'ai rencontré un problème que le compilateur C++ de ne pas accepter.
J'ai simplifié mon code dans l'exemple suivant fichiers. l'en-tête.h représente un en-tête de la suppier bibliothèque principale.c/rpc sont mes propres fichiers. Mon application est une application C++, donc je veux le faire fonctionner avec main.cpp.
l'en-tête.h (notez la ligne 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
principal.c:
#include <stdio.h>
#include "header.h"
int main() {
union teststruct a;
a.u64=5;
printf("%x\n", a.u64);
return 0;
}
main.cpp (même en tant que principal.c mais avec un supplément de extern "C"
déclaration):
#include <stdio.h>
extern "C" {
#include "header.h"
}
int main() {
union teststruct a;
a.u64=5;
printf("%x\n", a.u64);
return 0;
}
La compilation principal.c à l'aide de la ligne de
gcc -o test main.c
compile sans problèmes. Cependant, la compilation de la version C++ en utilisant le compilateur g++ avec la commande
g++ -o test main.cpp
donne à la suite d'erreurs du compilateur:
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;
^
Le problème est que le fournisseur a utilisé le même nom (u64) pour à la fois le type et le nom de la variable, ce qui semble une mauvaise idée, pour commencer, mais gcc apparemment l'accepte. Je ne veux pas changer la bibliothèque (c'est à dire d'en-tête.h) qu'il est très grand,cela se produit beaucoup dans le code, et je reçois parfois des mises à jour pour elle. Est-il un moyen de faire de g++ accepter cette combinaison, ou un moyen de modifier main.cpp pour le faire compiler sans modification de l'en-tête.h?