OVH Cloud OVH Cloud

Erreur de mon parser C++

2 réponses
Avatar
Seb
Bonjour,

Je ne sais pas trop si ma question a sa place ici mais comme a priori elle
ne dépend d'aucun système, je vous la soumet :


J'ai donc un souci avec la compilation d'un de mes fichiers (il est en ".c"
pour des raisons historiques, je ne sais pas si cela a la moindre
importance). Lorsque je le compile,

Mes premières lignes sont les suivantes :

#include <sys/cdefs.h>
#include <sys/types.h>

Le compilateur me fait une "parse error before string constant" dans le
fichier "types.h". Le souci c'est qu'à la ligne de l'erreur j'ai :

__BEGIN_DECLS

et que ce symbole a été définit comme étant extern "C"
Auriez-vous déjà eu ce genre de problèmes parce que là j'vois plus :-(

Sébastien

2 réponses

Avatar
Loïc Joly
Seb wrote:

Bonjour,

Je ne sais pas trop si ma question a sa place ici mais comme a priori elle
ne dépend d'aucun système, je vous la soumet :


J'ai donc un souci avec la compilation d'un de mes fichiers (il est en ".c"
pour des raisons historiques, je ne sais pas si cela a la moindre
importance). Lorsque je le compile,

Mes premières lignes sont les suivantes :

#include <sys/cdefs.h>
#include <sys/types.h>

Le compilateur me fait une "parse error before string constant" dans le
fichier "types.h". Le souci c'est qu'à la ligne de l'erreur j'ai :

__BEGIN_DECLS

et que ce symbole a été définit comme étant extern "C"
Auriez-vous déjà eu ce genre de problèmes parce que là j'vois plus :-(


J'ai l'impression que tu essaie de compiler du code spécifique à un
environnement dans un autre environneemnt pour lequel il n'a pas été
prévu. <sys/cdefs.h> et <sys/types.h> ne sont pas des headers standard
en C++.

--
Loïc

Avatar
espie
In article <brneh1$nm4$,
Seb wrote:
Bonjour,

Je ne sais pas trop si ma question a sa place ici mais comme a priori elle
ne dépend d'aucun système, je vous la soumet :


J'ai donc un souci avec la compilation d'un de mes fichiers (il est en ".c"
pour des raisons historiques, je ne sais pas si cela a la moindre
importance). Lorsque je le compile,

Mes premières lignes sont les suivantes :

#include <sys/cdefs.h>
#include <sys/types.h>

Le compilateur me fait une "parse error before string constant" dans le
fichier "types.h". Le souci c'est qu'à la ligne de l'erreur j'ai :

__BEGIN_DECLS

et que ce symbole a été définit comme étant extern "C"
Auriez-vous déjà eu ce genre de problèmes parce que là j'vois plus :-(


Non, je n'ai jamais eu ce genre de problemes, par contre, je vois tres
bien ce qui t'arrive.

Sur certains systemes, __BEGIN_DECLS sert a `proteger' les declarations
de fonctions dans les entetes pour pouvoir s'en servir en C++.

C'est cense devenir plus ou moins;
#ifdef __cplusplus
#define __BEGIN_DECLS extern "C" {
#define __END_DECLS }
#else
#define __BEGIN_DECLS
#define __END_DECLS
#endif

Ca permet de parentheser une serie de prototypes comme suit:
__BEGIN_DECLS
extern void f(int);
extern int g(void);
__END_DECLS

Et hop, on a des fonctions C avec les conventions d'appel de C, meme en
C++.

Dans ton cas, visiblement, ton environnement de developpement compile un
fichier .c comme un fichier, mais definit quand meme la macro __cplusplus
(oh le vilain), d'ou le probleme, vu que extern "C" { ne veut rien dire
en C...

De plusieurs choses l'unes:
- soit tu as un fichier d'entete qui fait un #define __cplusplus errone;
- soit tu as une definition de __cplusplus qui traine dans un Makefile ou
assimile;
- soit ton compilo est VRAIMENT buggue et definit __cplusplus meme quand
tu compiles du C;
- soit tu as une fonctionnalite de type `entetes pre-compiles' qui
fonctionne de maniere aberrante (ou dont tu as mal lu la doc) et qui a
defini un jour __cplusplus et qui relit le meme fichier d'entetes
rapidement sans se preoccuper de savoir si elle devrait s'inquieter
de la definition de C++.

Voila pour le diagnostic precis... pour la solution, c'est a toi de voir.