Ошибка C: объявление функции прототипа выходит за рамки - PullRequest
1 голос
/ 29 июня 2011

Я не понимаю, в чем моя ошибка:

 void main(char string[])
 {
   strcpy(command_E,string);
   processCMD(); /*FIRST ERROR:  prototype function declaration not in scope */
 }

 void processCMD(void) /*SECOND ERROR: external item attribute mismatch */
 {
  .... /*rest of code not displayed*/

Ответы [ 2 ]

4 голосов
/ 29 июня 2011

В тот момент, когда вы используете processCMD(), вы не объявили прототип для него, поэтому он получает по умолчанию.

Тот факт, что вы не объявили его, вызывает первую ошибку.

Тот факт, что ваше фактическое определение конфликтует с созданным по умолчанию определением, потому что вы не объявили его, является причиной вашей второй ошибки.

Решение состоит в том, чтобы либо определить функцию перед использованием:

void processCMD(void) {
    blah blah blah
}

void main (char string[]) {  // not really a good definition for main, by the way.
    strcpy(command_E,string);
    processCMD();
}

или предоставьте прототип перед использованием:

void processCMD(void);

void main (char string[]) {  // not really a good definition for main, by the way.
    strcpy(command_E,string);
    processCMD();
}

void processCMD(void) {
    blah blah blah
}

Что касается объявления main, две канонические формы:

int main (void);
int main (int argc, char *argv[]); // or char **argv.

Другие разрешены стандартом (реализация определена), но эти два требуются (по крайней мере, для размещенных реализаций - автономные реализации, такие как встроенные системы или операционные системы, вполне могут делать все, что хотят).

1 голос
/ 29 июня 2011

Вам нужен прототип перед первым использованием функции, чтобы объявить его, чтобы компилятор знал, какие аргументы принимает функция (если есть) и что она возвращает:

void processCMD(void); // prototype

void main(char string[])
 {
   strcpy(command_E,string);
   processCMD();
 }

 void processCMD(void)
 {
  .... /*rest of code not displayes*/

В качестве альтернативы, выможет определить функцию до ее первого использования (поскольку определение предоставит информацию, которую хочет компилятор.

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

Некоторые дополнительные мелочи прототипа:

  • Обычно в C отсутствие прототипа само по себе не является ошибкой - если компилятор видит вызов функции, не увидев прототипа, он будет предполагать, что вы передаетеправильные параметры, он будет применять «продвижение по умолчанию» для параметров (Basically преобразует вещи в int ot double в зависимости от ситуации) и будет считать, что функция возвращает int.Если эти предположения неверны, то программа неверна и будет иметь неопределенное поведение.Компиляторы часто могут быть настроены на выдачу предупреждений или ошибок при вызове функций, у которых нет прототипов (очевидно, у вас есть).В C ++ вызов функции без видимого предыдущего прототипа (или полного определения функции) всегда является ошибкой.

  • В C существует разница между:

    void processCMD();
    

    и

    void processCMD(void);
    

    Первый - это объявление функции, но не прототип - он сообщает компилятору, что processCMD - это функция и что она возвращает void вместо int.Но это ничего не говорит компилятору об аргументах.Компилятор по-прежнему будет разрешать вызовы функций с передаваемыми аргументами и будет применять промоакции по умолчанию.(Опять же, эта функция может быть отключена конфигурацией компилятора.)

    Второй - это прототип, который специально сообщает компилятору, что функция не принимает аргументов.

    В C ++ оба являются эквивалентными и определенносообщить компилятору, что функция не принимает аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...