функции в с на Linux - PullRequest
       6

функции в с на Linux

0 голосов
/ 20 ноября 2018

Я на самом деле работаю на языке C в Ubuntu 18.04.Я не использую IDE.

#include <stdio.h>

void main()
{
    message();
    printf("\nCry, and you stop the monotomy!\n");
}

void message()
{
    printf("\nSmile, and the worldsmiles with you...");
}

Когда я запускаю это, он возвращает сообщение об ошибке следующим образом.

msg.c: In function ‘main’:

msg.c:5:2: warning: implicit declaration of function ‘message’ [-Wimplicit-function-declaration]

  message();

  ^~~~~~~

msg.c: At top level:

msg.c:8:6: warning: conflicting types for ‘message’

 void message()

      ^~~~~~~

msg.c:5:2: note: previous implicit declaration of ‘message’ was here

  message();

  ^~~~~~~

Когда я помещаю функцию сообщения выше main(), тогда она показываетНет ошибок.Почему это?Разве мы не можем поставить функции после main()?Что такое неявное объявление здесь?

Ответы [ 4 ]

0 голосов
/ 20 ноября 2018

Когда я помещаю функцию сообщения выше main (), она не показывает ошибку.Почему это?Разве мы не можем поместить функции после main ()?

C Исходные файлы анализируются сверху вниз.Таким образом, к тому времени, когда компилятор видит вызов функции message (в основном), он должен знать об этом (в основном это относится и к любому символу).Вот почему это выше работает, но ниже приводит к диагностике.

Как минимум, вы должны предоставить объявление для любого идентификатора перед его использованием.

Что такое неявное объявление здесь?

Когда компилятор видитвызов функции и не знал об этом, он предполагает функция возвращает int (например, int message();).Это «неявное объявление».Это было древнее правило, которое действовало до C99 .

Но в C99 и позже это правило было удалено.Таким образом, ваш код (который помещает определение «сообщение» ниже основного без объявления) недействителен в C99 и позже.См. вызовы функций C: понимание правила "implicit int" .

Позже, когда компилятор увидит фактическое определение message (то есть void message() {...), он увидит тип возвращаемого значенияна самом деле void.Таким образом, это вступает в противоречие с его собственной декларацией (где оно приняло int).Таким образом, он генерирует:

msg.c:8:6: warning: conflicting types for ‘message’
0 голосов
/ 20 ноября 2018

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

void message();
void main()
...

. Без этого компилятор предполагает, что message является внешней связью.функция, возвращающая int, а затем, когда она сталкивается с вашим фактическим определением message, она жалуется на конфликтующие типы для message (поскольку она уже решила, что сообщение возвращает int, а не void).

0 голосов
/ 20 ноября 2018

Когда компилятор достигает message(); (в основном), компилятор ничего не знает о функции message.

Теперь он старается изо всех сил.Таким образом, он выдает предупреждение, а затем предполагает, что message должен был быть объявлен int message();

Так что, когда компилятор наконец доберется до void message() - он говорит: «Привет - я думал, что это будет int messgae»,Отсюда и предупреждение.

Просто поставьте либо message перед main, поэтому, когда дело доходит до компиляции main, компилятор узнает о message.

Или, как говорили другие авторы.,Объявите это наверху.

0 голосов
/ 20 ноября 2018

Вы сначала должны определить или объявить свой метод, прежде чем вызывать его.В следующем примере я объявляю метод перед вызовом его в main:

#include<stdio.h>

// Declare the method
void message();

void main()
{
    // Call the method
    message();
    printf("\nCry, and you stop the monotomy!\n");
}

// Define the method
void message()
{
    printf("\nSmile, and the worldsmiles with you...");
}

PS: я бы изменил тип возвращаемого значения main() на int.Подробнее в Что должно возвращать main () в C и C ++?

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