Errore in funzione di due righe

di il
10 risposte

Errore in funzione di due righe

Salve a tutti,
ho ripreso un vecchio progetto scritto in C e sto ricevendo un errore assurdo.
In main.c ho inserito la seguente funzione:
void test(){
	printf("Test.");
	int i=0;
}
L'errore che ricevo è relativo alla riga dell'intero e recita:
Errore 1 error C2143: errore di sintassi: ';' mancante prima di 'tipo'
Ottengo questo errore solamente mettendo il "printf" ad inizio funzione.
Il progetto è settato correttamente per il C ed ha diverse funzioni al suo interno; se però aggiungo un printf ad inizio di una qualsiasi funzione ottengo nuovamente quell'errore.
Non sto capendo se ho preso un abbaglio e sto commettendo un errore ridicolo oppure se il compilatore mi sta prendendo in giro.

Qualcuno saprebbe dirmi perché accade ciò?

Grazie in anticipo a chiunque vorrà aiutarmi.

10 Risposte

  • Re: Errore in funzione di due righe

    Chiama il file main.cpp
  • Re: Errore in funzione di due righe

    Se sei sicuro di avere a che fare con sorgenti C, e non C++, è altamente probabile che il compilatore segua lo standard C89, dal momento che prima del C99 era obbligatorio dichiarare tutte le variabili all'inizio delle funzioni, prima di qualsiasi operazione.

    Esempio con Clang ed opzione -ansi (C89)
    
    username@host:~$ cat test.c 
    #include <stdio.h>
    void test()
    {
    	printf("Hello World!\n");
    	int x = 1;
    }
    
    username@host:~$ clang -Werror -Weverything -ansi -pedantic test.c
    test.c:5:6: error: ISO C90 forbids mixing declarations and code
          [-Werror,-Wdeclaration-after-statement]
            int x = 1;
                ^
    test.c:5:6: error: unused variable 'x' [-Werror,-Wunused-variable]
    test.c:2:6: error: no previous prototype for function 'test'
          [-Werror,-Wmissing-prototypes]
    void test()
         ^
    3 errors generated.
    
    C99
    
    username@host:~$ cat test.c 
    #include <stdio.h>
    void test()
    {
    	printf("Hello World!\n");
    	int x = 1;
    }
    
    username@host:~$ clang -Werror -Weverything -std=c99 -pedantic test.c
    test.c:5:6: error: unused variable 'x' [-Werror,-Wunused-variable]
            int x = 1;
                ^
    test.c:2:6: error: no previous prototype for function 'test'
          [-Werror,-Wmissing-prototypes]
    void test()
         ^
    2 errors generated.
    
    
  • Re: Errore in funzione di due righe

    oregon ha scritto:


    Chiama il file main.cpp
    Non cambia nulla..

    Inizio a pensare che il progetto sia corrotto..Lo ricreerò da zero quando avrò tempo!

    Grazie per le risposte!
  • Re: Errore in funzione di due righe

    Con cosa compili? Quale tipo di progetto usi?
  • Re: Errore in funzione di due righe

    Secondo me ha ragione loopunrolling: dichiarare una variabile in posti che non siano all'inizio di un blocco è vietato nel C più tradizionale. Ho anche perplessità in merito all'assenza dei parametri.

    Prova a riscrivere in questo modo e vedi se funziona:
    void test( void ){
       int i=0;
       printf("Test.");
    }
    In questo modo, probabilmente, riceverai solo la segnalazione della presenza d'una variabile inutilizzata.
  • Re: Errore in funzione di due righe

    Aldo ... è ovviamente questo il problema ma se compili con un compilatore c++ questo scompare.

    La questione è solo sapere con quale compilatore e opzioni sta compilando
  • Re: Errore in funzione di due righe

    @AldoBaldo grazie per la risposta ma come avevo già scritto se sposto il printf tutto funziona, ma la questione era capire il motivo di quel problema

    @oregon utilizzo Visual Studio 2012
  • Re: Errore in funzione di due righe

    Scusa Enrichetto ... anche io utilizzo VS2012 (come altre versioni) e non ho mai avuto questo problema.

    Che tipo di progetto hai creato? Quali opzioni hai modificato?

    Crea un progetto Console C++ e ricompila le due linee. Vedrai che funziona.
  • Re: Errore in funzione di due righe

    Enrichetto, il motovo della segnalazione di quell'errore sta nel fatto che le versioni più tradizionali del C prevedono che la definizione delle variabili avvenga esclusivamente in testa al blocco che ne delimita lo scopo. Nell'esempio che ti dà errore, tu invece definisci "int i" dopo avere già fatto altro con printf().

    Dunque hanno ragione quelli che ti suggeriscono di cambiare le impostazioni del progetto, in modo che il tuo codice venga interpretato secondo standard più moderni e meno vincolanti.

    In alternativa, sposta la definizione di "int i" in testa al blocco. Se non puoi inizializzare la variabile "i" in quella posizione perché non hai ancora i dati necessari, definiscila ugualmente in testa al blocco e rimanda l'inizializzazione al momento in cui hai a disposizione quel che ti serve.

    Purtroppo non saprei spiegarmi in modo più lineare.
  • Re: Errore in funzione di due righe

    Confermo che creando un nuovo progetto tutto funziona. Sicuramente come avete spiegato voi c'era qualche impostazione secondo cui veniva applicato uno standard "precedente". Controllerò con calma tutte le impostazioni relative al progetto, mi incuriosisce cosa avevo inserito (è un progetto molto vecchio!)

    Grazie ancora per le risposte!
Devi accedere o registrarti per scrivere nel forum
10 risposte