2015-04-13 12 views
7

Ho un semplice programma:implicita dichiarazione di funzione 'getch'

#include <stdio.h> 
#include <stdlib.h> 

int main(void){ 
    printf("Hello world!\n"); 

    getch(); 

    return 0; 
} 

Anche se ottengo l'avvertimento

implicit declaration of function 'getch' 

il programma funziona bene. Mi manca qualcosa? E se lo faccio, perché il programma funziona bene?

+0

'getch()' o 'getchar()'? –

+9

Il 'getch()' non standard è in 'conio.h' (anche non standard), che non hai incluso. Funziona perché il tipo restituito è compatibile con il tipo di ritorno implicito assunto dal compilatore: 'int'. In breve, tu eri (dis) fortunato. Potresti usare ['getchar()'] (http://en.cppreference.com/w/c/io/getchar). – WhozCraig

+2

Grazie @WhozCraig per il tuo commento (se era una risposta che potrei accettare volentieri) –

risposta

9

Si ottiene l'avviso

implicit declaration of function 'getch' 

perché non avete includere qualsiasi intestazione che dichiara getch. Nessuna funzione di questo tipo è dichiarata nelle intestazioni standard <stdio.h> o <stdlib.h>.

In realtà, non esiste alcuna funzione denominata getch in qualsiasi intestazione C standard.

Prima dello standard C99, il linguaggio C consentiva le chiamate alle funzioni senza dichiarazione visibile. Tale chiamata creerebbe di fatto una dichiarazione implicita di una funzione restituendo int e prendendo argomenti di qualunque tipo (promosso) effettivamente passato.

A seconda di ciò, non è mai stata una buona idea. È necessario sempre avere un'appropriata direttiva #include per l'intestazione che dichiara qualsiasi funzione di libreria utilizzata nel programma.

C99 cadere la regola "implicita int" e ha fatto alcuna chiamata a una funzione senza dichiarazione visibile una violazione vincolo, che richiede una diagnosi (che diagnostica viene permesso di essere un errore non fatale.)

Se si sta compilando su Windows, se ricordo correttamente, c'è una funzione getch() dichiarata in <conio.h>. Se si desidera utilizzare tale funzione, è necessario aggiungere #include <conio.h> al programma.

Non consiglio di farlo; l'utilizzo di getch() non è necessario e rende il programma non portatile. Alcuni ambienti di sviluppo di Windows rendono difficile eseguire "programmi di console" (programmi che stampano su output standard anziché creare una GUI); spesso l'esecuzione di un programma di questo tipo crea una finestra temporanea che viene distrutta non appena termina il programma. Chiamare la funzione standard getchar() è un altro modo per evitare che la finestra svanisca. Oppure puoi eseguire il programma da un prompt dei comandi e il suo output apparirà nella finestra di comando corrente.

Se si sta compilando su un sistema simile a UNIX, esiste un'altra funzione denominata getch(), dichiarata in <curses.h>. Posso compilare ed eseguire il tuo programma su Linux se aggiungo -lcurses alla riga di comando del compilatore. Ma non dovresti usare la funzione getch() se non hai prima configurato l'ambiente curses ed è abbastanza chiaro che non vuoi farlo.

Idealmente, il classico "ciao mondo" programma dovrebbe essere solo:

#include <stdio.h> 
int main(void) { 
    printf("Hello world!\n"); 
    return 0; 
} 

Come si ottiene che a correre e ti permettono di vedere l'uscita dipende dal proprio ambiente (che non ci hanno raccontato) .

+0

Sono su una macchina Windows 7, codice :: blocchi ide, compilatore gcc. Voglio solo che il programma si fermi e premere un tasto per uscire. 'getchar()' funziona bene ma devo anche premere 'enter'. Grazie per il tuo tempo e la tua risposta dettagliata :) –

+2

@jimjim: puoi semplicemente premere , non è necessario digitare prima un altro carattere. Puoi provare qualcosa come 'printf (" Digitare per uscire: "); fflush (stdout); getchar(); '. Oppure puoi eseguire il programma da una finestra di comando e lasciarlo eseguire fino al completamento. (Potrebbe esserci un modo per richiamare Windows 'getch()' nel proprio ambiente, ma non conosco i dettagli. Potrebbe essere semplice come aggiungere '#include '.) –

+0

Su gcc perché è necessario fermare il programma? –

4

per Linux, di questo codice:

#include <stdio.h> 
#include <termios.h> 
#include <unistd.h> 

int getch (void) 
{ 
     int ch; 
     struct termios oldt, newt; 

     tcgetattr(STDIN_FILENO, &oldt); 
     newt = oldt; 
     newt.c_lflag &= ~(ICANON|ECHO); 
     tcsetattr(STDIN_FILENO, TCSANOW, &newt); 
     ch = getchar(); 
     tcsetattr(STDIN_FILENO, TCSANOW, &oldt); 

     return ch; 
} 

Per Windows, aggiungi questa linea:

#include <conio.h> 
+1

Grazie per la risposta. Sto usando windows 7. –

+0

Poiché non c'è alcun chiarimento nella domanda, questa risposta sembra essere in riferimento a gcc ... –

Problemi correlati