【问题标题】:functions in c on linuxlinux上的c函数
【发布时间】:2018-11-20 16:07:38
【问题描述】:

我实际上是在 Ubuntu 18.04 上使用 C 语言。我不使用任何 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() 之后吗?这里的隐式声明是什么?

【问题讨论】:

  • 你需要在main之前声明函数:void message();
  • 你需要在使用之前对你的函数进行 decalre。只需在 main void message(); 之前放一个原型即可
  • main 的正确声明是 int main (void)int main (int argc, char **argv)(您将看到用等效的 char *argv[] 编写)。 注意: maintype int 的函数,它返回一个值。请参阅:C11 Standard §5.1.2.2.1 Program startup p1 (draft n1570)

标签: c function


【解决方案1】:

如果你愿意,你可以把函数放在main之后;只是如果你在main中调用它们,在它们被定义之前,你也应该在main之前声明它们:

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

如果没有这个,编译器会假定message 是一个返回int 的外部链接函数,然后当它遇到message 的实际定义时,它会抱怨message 的类型冲突(因为它已经决定消息返回int,而不是void)。

【讨论】:

  • 感谢戈文德!我得到它。你解释得很顺利。
  • 更好的void message(void);,因为void message(); 意味着函数不检查参数类型,因此编译器不会检查/将参数类型转换为正确的类型。
【解决方案2】:

在调用它之前,您首先要定义或声明您的方法。在下面的示例中,我在 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。阅读更多What should main() return in C and C++?

【讨论】:

  • 谢谢!你的代码帮助我理解了我的错误。
【解决方案3】:

当编译器到达message();(主要)时,编译器对函数message一无所知。

它现在尽力而为。所以它给你一个警告然后假设message应该被声明为int message();

所以当编译器最终到达void message() 时 - 它会说“你好 - 我认为它会是 int messgae”。因此发出警告。

只需将message 放在main 之前,这样当编译main 时,编译器就会知道message

或者正如其他海报所说的那样。在顶部声明它。

【讨论】:

  • 谢谢。明白了。
【解决方案4】:

当我将消息函数放在 main() 之上时,它没有显示错误。为什么?我们不能把函数放在 main() 之后吗?

C 源文件是自顶向下解析的。因此,当编译器看到函数调用 message(在 main 中)时,它必须知道它(这同样适用于任何符号,基本上)。这就是为什么把它放在上面可以工作,但放在下面会导致诊断。

至少,您必须在使用任何标识符之前为其提供声明。

这里的隐式声明是什么?

当编译器看到一个函数调用并且不知道它时,它假定该函数返回一个int(例如int message();)。这就是“隐式声明”。这是一条在C99 之前有效的古老规则。

但在 C99 及更高版本中,此规则已被删除。因此,您的代码(在没有声明的情况下将“消息”的定义放在 main 下面)在 C99 及更高版本中无效。 见C function calls: Understanding the "implicit int" rule

稍后当编译器看到message(即void message() {...)的实际定义时,它会看到返回类型实际上是void。因此这与它自己的声明相冲突(它假定它的int)。所以它生成:

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

【讨论】:

  • 感谢隐式部分的指导。真的帮了我
猜你喜欢
  • 2021-04-22
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多