Domanda

Ho scritto un programma in C con Ubuntu Linux e ora ho bisogno di portarlo su una macchina UNIX (o quella che credo sia una scatola UNIX). Si compila bene sul mio Ubuntu con GCC ma quando provo a compilarlo con GCC sulla scatola UNIX, dà questo errore:

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)

I problemi principali sembrano essere l'errore di analisi prima di char (gli altri sono correlati)

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

Queste sono solo semplici dichiarazioni di stringhe in stile C. Esiste un file di intestazione che devo includere per farlo funzionare in UNIX?

P.S. qual è il comando per vedere quale versione di unix e quale versione di gcc stai usando? Sapere questo mi permetterà di essere più specifico nella mia domanda.

Grazie

È stato utile?

Soluzione

Se si sta compilando C pura, le variabili devono essere dichiarate all'inizio delle funzioni. Ne parlo perché molte persone compilano i loro programmi C usando compilatori C ++, che offrono quindi alcune risorse normalmente non disponibili per i compilatori C puri, l'esempio più comune sono le // righe di commento.

Altri suggerimenti

Se vuoi assicurarti che il tuo codice sia portatile, usa sempre gli errori -pedantic o -pedantic.

Ciò fornirà avvisi / errori in cui il codice si discosta dalla conformità agli standard.

Mentre siamo sull'argomento. Probabilmente dovresti anche attivare tutti gli avvisi. Ci sono buoni motivi per cui il compilatore ti avverte; quando si sposta il codice da una piattaforma all'altra, questi avvisi sono la fonte di potenziali bug poiché il nuovo hardware / sistema operativo / compilatore potrebbe non funzionare come quello attuale.

Utilizza anche l'eseguibile frontend GCC corretto: g ++ Tratterà i file * .c come i file C ++ a meno che tu non lo dica esplicitamente. Quindi se stai compilando C reale allora usa gcc non g ++.

  

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

Per aiutare con il tuo problema specifico, può essere utile vedere la riga 43. Sebbene l'errore indichi la riga 44, molti problemi sono causati dalla causa che ha un problema e il problema non viene rilevato dal parser fino a quando non si arriva a il primo lessema nella riga successiva.

Come hai copiato il file? È possibile che tu abbia inserito qualcosa che non dovrebbe essere lì?

BTW: correggi l'uso del tag del codice nel tuo codice: al momento è quasi impossibile leggere senza usare " visualizza sorgente " nel mio browser.

Per quanto riguarda le domande finali:

uname -a
gcc -v

Quando provi a scrivere un codice portatile, i seguenti flag del compilatore ti diranno molti problemi prima per quanto riguarda il tentativo di compilare il codice sulla piattaforma successiva:

-std=c89 -pedantic -Wall

Se devi solo scegliere come target GCC su altre piattaforme, non su altri compilatori, puoi provare:

-std=gnu89 -pedantic -Wall

Ma immagino che questo potrebbe consentire estensioni GNU su un GCC più recente che non sono supportate su uno più vecchio. Non ne sono sicuro.

Nota che, sebbene sarebbe bello se fosse garantito che -pedantic avvertisse di tutti i programmi non standard, non lo è. Ci sono ancora alcune cose che manca.

Dovrai fornirci un maggior contesto per gli errori ... almeno uno, probabilmente più righe prima delle righe 44 e 54. A indovinare, se ci dai il codice dall'inizio della definizione della funzione prima della riga 44 (forse la linea 40 o giù di lì) fino alla linea 54 (o poche righe dopo - forse la linea 60), allora potremmo essere in grado di aiutare. Qualcosa è in linea con le informazioni prima della linea 44 che le stanno facendo aspettare qualcosa di diverso da " char 'alla riga 44; idem (probabilmente lo stesso problema) alla riga 54.

Le informazioni non sono sufficienti. Il codice sopra è almeno altrettanto interessante e bisogna farlo sapere se si parla di ANSI C89 o ANSI C99. La prima risposta è sbagliata in questo senso ampio.

Saluti Friedrich

Steve,

Il primo messaggio di errore indica " errore di analisi prima di 'char' " ;. Qual è il codice che precede char? È una dichiarazione di funzione? Include tipi definiti dall'utente o qualcosa del genere?

La fonte più probabile di questo errore è che qualcosa di poco sopra la riga 44 utilizza un tipo o una macro dichiarata in un file di intestazione ... che il file di intestazione può differire tra il proprio sistema Ubuntu e il uno su cui stai tentando di compilare.

Che cos'è UNIX? AIX, Ultrix, Minix, Xenix?

GCC ha una versione " - " Bandiera:

gcc --version

Per visualizzare la versione di GCC:

gcc --version

Potrebbe essere utile mostrare la funzione in modo da poter vedere il codice circostante. Questo è spesso il problema con "errore di analisi prima di" errori di tipo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top