2015-04-13 2 views
7

У меня есть простая программа:неявной декларации функции «» Геча

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

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

    getch(); 

    return 0; 
} 

Даже если я получаю предупреждение

implicit declaration of function 'getch' 

программа работает нормально. Я что-то пропустил? И если да, то почему программа работает нормально?

+0

'getch()' или 'getchar()'? –

+9

Нестандартный 'getch()' находится в 'conio.h' (также нестандартном), который вы не указали. Он «работает», потому что тип возврата совместим с неявным типом возвращаемого значения, принятым компилятором: 'int'. Короче говоря, вам повезло. Подумайте, вместо этого используйте ['getchar()'] (http://en.cppreference.com/w/c/io/getchar). – WhozCraig

+2

Спасибо @WhozCraig за ваш комментарий (если бы это был ответ, который я с радостью принимаю) –

ответ

9

Вы получаете предупреждение о

implicit declaration of function 'getch' 

, потому что вы не включают заголовок который объявляет getch. В стандартных заголовках такая функция не объявляется <stdio.h> или <stdlib.h>.

Фактически, нет функции с именем getch в любой стандартный заголовок C.

До стандарта C99 язык C допускал вызовы функций без видимого объявления. Такой вызов фактически создаст неявное объявление функции, возвращающей int, и примет аргументы любого (продвинутого) типа, который вы фактически передали.

В зависимости от этого никогда не было хорошей идеей. Вы должны всегда имеют правильную директиву #include для заголовка, которая объявляет любую библиотечную функцию, которую вы используете в своей программе.

C99 упал правило «неявный int» и сделал любой вызов функции без видимой декларации будет нарушение ограничения, требуя диагностику (диагностический дозволено быть не фатальная ошибкой.)

Если вы компилируете в Windows, если я правильно помню, есть функция getch(), объявленная в <conio.h>. Если вы хотите использовать эту функцию, вам нужно добавить #include <conio.h> в свою программу.

Я не рекомендую это делать; использование getch() не является необходимым и делает вашу программу не переносной. В некоторых средах разработки Windows сложно запускать «консольные программы» (программы, которые печатаются на стандартный вывод, а не на создание графического интерфейса); часто запуск такой программы создает временное окно, которое уничтожается, как только программа заканчивается. Вызов стандартной функции getchar() - еще один способ избежать исчезновения окна. Или вы можете выполнить программу из командной строки, и ее вывод появится в вашем текущем окне команд.

Если вы компилируете UNIX-подобную систему, есть еще одна функция: getch(), объявленная в <curses.h>. Я могу скомпилировать и выполнить вашу программу в Linux, если я добавлю -lcurses в командную строку компилятора. Но вы не должны использовать эту функцию getch(), если вы еще не создали среду проклятий, и довольно ясно, что вы не хотите этого делать.

В идеале, классический «привет мир» программа должна быть просто:

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

Как вы получите, что для запуска и пусть вы видите выход зависит от среды (которые вы не сказали нам о) ,

+0

Я нахожусь на машине с Windows 7, код :: blocks ide, gcc-компилятор. Я просто хочу, чтобы программа остановилась и нажмите клавишу для выхода. 'getchar()' отлично работает, но я также должен нажать 'enter'. Спасибо за ваше время и ваш подробный ответ :) –

+2

@jimjim: Вы можете просто нажать , не нужно набирать еще одного символа. Вы можете попробовать что-то вроде 'printf (« Тип для выхода: »); fflush (стандартный вывод); GetChar(); '. Или вы можете запустить программу из командной строки и запустить ее до завершения. (Возможно, есть способ вызвать Windows 'getch()' в вашей среде, но я не знаю деталей. Это может быть так же просто, как добавление '#include '.) –

+0

На gcc зачем вам нужно остановить программу? –

4

Для Linux, используйте этот код:

#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; 
} 

для Windows, добавьте следующую строку:

#include <conio.h> 
+1

Благодарим вас за ответ. Я использую окна 7. –

+0

Поскольку в вопросе нет пояснений, этот ответ, похоже, относится к gcc ... –

Смежные вопросы