2016-12-07 2 views
2

Un peu d'histoire:typedef et #define avec le même nom

Je suis en train de le port des fichiers .ksh que j'ai en cours d'exécution sur Solaris pour fonctionner sur Windows en utilisant Cygwin. Il y a une différence entre l'implémentation de ksh qui s'exécute sur la boîte Solaris et l'implémentation de pdksh qui est facilement installable dans Cygwin qui traite des sous-couches - vous pouvez vérifier this question pour les détails si vous le souhaitez.

En raison de cette différence, j'essaye de construire la trousse d'outils d'AST trouvée here parce que les binaires ne sont plus disponibles d'AT & T selon this question.

Ma question:

Lorsque je tente de construire selon les instructions du site GitHub, je le vent avec une erreur de compilation d'un fichier appelé fastfind.c:

+ cc -D_BLD_STATIC -D_BLD_DLL -D_BLD_ast -I. -I/ast-master/src/lib/libast -Icomp -I/ast-master/src/lib/libast/comp -Imisc -I/ast-master/src/lib/libast/misc -Iinclude -I/ast-master/src/lib/libast/include -Istd -I/ast-master/src/lib/libast/std -D_PACKAGE_ast -c /ast-master/src/lib/libast/misc/fastfind.c, 
In file included from /ast-master/src/lib/libast/std/stdio.h:22:0, 
    from ./ast_wchar.h:87, 
    from /ast-master/src/lib/libast/include/regex.h:39, 
    from /ast-master/src/lib/libast/misc/findlib.h:35, 
    from /ast-master/src/lib/libast/misc/fastfind.c:77: 
./ast_stdio.h:82:15: error: conflicting types for '_sfio_FILE' 
#define FILE _sfio_FILE 
      ^
./ast_stdio.h:80:24: note: previous declaration of '_sfio_FILE' was here 
typedef struct _sfio_s _sfio_FILE; 
         ^
mamake [lib/libast]: *** exit code 1 making fastfind.o 

Lignes 80 -82 du fichier ast_stdio.h sont les suivantes:

80: typedef struct _sfio_s _sfio_FILE; 
81: 
82: #define FILE  _sfio_FILE 

en outre, le haut du fichier ast_stdio.h ont ceci:

/* : : generated by proto : : */ 
/* : : generated from /ast-master/src/lib/libast/features/stdio by iffe version 2012-07-17 : : */ 

Enfin, voici mes informations pertinentes cc:

$ cc --version 
cc (GCC) 5.4.0 

Un peu disclaimer: mon C est rouillé que je suis un gars de Java depuis 14 ans. Ma compréhension est que la directive #define est évaluée par le préprocesseur, donc la ligne 82 remplacerait essentiellement la chaîne FILE par _sfio_FILE dans le code, et la ligne typedef ne serait pas évaluée jusqu'à la compilation proprement dite.

De toute évidence, je me trompe, ou cette erreur ne se produirait pas. Et évidemment ce code compile pour quelqu'un, ou il n'aurait pas été publié de cette façon. Toute idée de ce qui se passe ici et comment je peux compiler ce fichier est appréciée. J'ai trouvé this question qui semble proche de ce que je demande, mais il y a quelque chose de différent entre mon cas et cette question, ou mon cerveau C n'est pas capable de comprendre pourquoi cette question devrait couvrir ma situation particulière.

Merci pour votre temps!

+0

Peut-être utiliser #undef? – koper89

+0

Pourriez-vous fournir un MCVE? http://stackoverflow.com/help/mcve – Yunnosch

Répondre

0

L'erreur était due à un changement de la glibc. Voir Red Hat Bugzilla # 1477082 pour plus d'informations et les modifications à apporter aux fichiers sources.