2008-09-30 7 views
1

J'ai écrit un programme en C avec Ubuntu Linux et maintenant je dois le porter sur une machine UNIX (ou ce que je crois être une boîte UNIX). Il compile très bien sur mon Ubuntu avec GCC, mais lorsque je tente de le compiler avec GCC sur la boîte UNIX, il donne cette erreur:Erreur de syntaxe avec une version différente de gcc?

a.c: In function `goUpDir': 
a.c:44: parse error before `char' 
a.c:45: `newDir' undeclared (first use in this function) 
a.c:45: (Each undeclared identifier is reported only once 
a.c:45: for each function it appears in.) 
a.c: In function `goIntoDir': 
a.c:54: parse error before `char' 
a.c:57: `newDir' undeclared (first use in this function) 
a.c:57: `oldDir' undeclared (first use in this function) 

Les principaux problèmes semblent être l'erreur d'analyse avant char (les autres sont liés

44 char newDir[50] = ""; 
54 char* oldDir = (char*)get_current_dir_name(); 

Ce ne sont que de simples déclarations de chaînes de style C. Y a-t-il un fichier d'en-tête que je dois inclure pour le faire fonctionner sous UNIX?

P.S. quelle est la commande pour voir quelle version d'unix et quelle version de gcc vous utilisez? Sachant cela me permettra d'être plus précis dans ma question.

Merci

+0

Qu'est-ce que c'est avant le caractère? Sur la ligne avant? Utilisez également la balise "code" pour formater votre code afin qu'il soit lisible. –

+0

Pour GCC: gcc --version Pour Unix: uname -a –

Répondre

3

Si vous compilez C pur, les variables doivent être déclarées sur beggining des fonctions. Je mentionne ceci parce que la plupart des gens compilent leurs programmes C en utilisant des compilateurs C++, qui offrent alors des ressources qui ne sont normalement pas disponibles pour les compilateurs C purs, l'exemple le plus courant étant les lignes de commentaires.

+0

Hahahah, c'est bien. J'ai pris cela pour acquis, je pensais que la plupart des codeurs en C le savaient, mais je suppose que certains prennent la sémantique C99 pour acquis aussi. :-P –

+3

C'est 9 ans plus tard. Je considère que le non-support de C99 est un bug. – wnoise

+1

Cette réponse est incorrecte de plusieurs façons. Je ne sais pas ce que signifie "C pur", car dans C99 vous pouvez certainement déclarer des variables après des déclarations. Aussi, même en C89, ce à quoi je crois que la réponse se rapporte, il est correct de dire qu'ils doivent être déclarés au début des blocs, pas des fonctions. – Chris

0

De quel UNIX s'agit-il? AIX, Ultrix, Minix, Xenix?

GCC a un "--version" drapeau:

gcc --version 
0

Pour afficher la version GCC:

gcc --version

Il pourrait aider à montrer la fonction afin que nous puissions voir le code environnant. C'est souvent le problème avec "erreur d'analyse avant" les erreurs de type.

1

Comment avez-vous recopié le fichier? Est-il possible que vous ayez inséré quelque chose qui ne devrait pas être là?

BTW: S'il vous plaît corriger votre utilisation de l'étiquette de code dans votre code - il est actuellement presque impossible de lire sans utiliser "view source" dans mon navigateur.

Quant à vous mettre fin à des questions:

uname -a 
gcc -v 
2

Si vous voulez vous assurer que votre code est portable utilise toujours les erreurs -pedantic--pedantic ou.

Ceci fournira des avertissements/erreurs où votre code s'écarte de la conformité aux normes.

Alors que nous sommes sur le sujet. Vous devriez probablement également activer tous les avertissements. Il y a de bonnes raisons pour lesquelles le compilateur vous avertit; Lorsque vous déplacez du code d'une plate-forme à une autre, ces avertissements sont la source de bogues potentiels car le nouveau matériel/OS/compilateur peut ne pas agir de la même manière que votre actuel.

Utilisez également l'exécutable GCC frontal correct: g ++ Traitera les fichiers * .c comme les fichiers C++ à moins que vous ne le disiez explicitement non plus. Donc, si vous compilez du vrai C, utilisez gcc et non g ++.

gcc -pedantic -Wall -Werror *.c
g++ -pedantic -Wall -Werror *.cpp

Pour aider avec votre problème spécifique, il peut être agréable de voir la ligne 43.Bien que l'erreur indique la ligne 44, beaucoup de problèmes sont causés par la ligne en cours qui a un problème et le problème n'est pas détecté par l'analyseur jusqu'à ce que vous arriviez au premier lexème sur la ligne suivante.

1

Lorsque vous essayez d'écrire du code portable, les drapeaux du compilateur suivants vous raconteront beaucoup de problèmes avant vous aller aussi loin que d'essayer de compiler le code sur la plate-forme suivante:

-std=c89 -pedantic -Wall 

Si vous seulement besoin de cibler GCC sur d'autres plates-formes, pas d'autres compilateurs, alors vous pouvez essayer:

-std=gnu89 -pedantic -Wall 

Mais je suppose que cela pourrait permettre des extensions GNU sur une version plus récente du CCG qui ne sont pas pris en charge sur une version plus ancienne. Je ne suis pas sûr. Notez que bien que ce serait bien si -pedantic avait l'assurance de prévenir tous les programmes non standard, ce n'est pas le cas. Il y a encore des choses qui manquent.

1

Vous devrez nous fournir plus de contexte pour les erreurs ... au moins une, probablement plusieurs lignes avant les lignes 44 et 54. En un mot, si vous nous donnez le code depuis le début de la définition de la fonction avant ligne 44 (peut-être la ligne 40) jusqu'à la ligne 54 (ou quelques lignes plus loin - peut-être la ligne 60 - nous pourrons peut-être vous aider.) Quelque chose se passe avec l'information avant la ligne 44. 'char' à la ligne 44, idem (probablement le même problème) à la ligne 54.

1

L'information est insuffisante Le code ci-dessus est au moins aussi interessant et on doit savoir si on parle de ANSI C89 ou ANSI C99 La première réponse est fausse dans ce sens large:

Cordialement Friedrich

1

Steve,

Le premier message d'erreur "parse errorbefore'char'". Quel est le code que précède char? Est-ce une déclaration de fonction? Inclut-il des types définis par l'utilisateur ou quelque chose du genre? La source la plus probable de cette erreur est que quelque chose bientôt dessus ligne 44 utilise un type ou une macro qui est déclaré dans un fichier d'en-tête ... ce fichier d'en-tête peut différer entre votre propre système Ubuntu et celui que vous êtes essayer de compiler.