#include <stdio.h>
void main()
{
m();
}
void m()
{
printf("hi");
}
输出
hi
警告
main.c:11:10: warning: conflicting types for 'm' [enabled by default]
void m()
^
main.c:7:9: note: previous implicit declaration of 'm' was here
m();
^
为什么这个程序成功运行,即使m()在定义之前被调用了? 警告的含义是什么?
答案 0 :(得分:7)
如果你没有在K&amp; RC / C89中声明一个函数,它会被隐式声明为返回int
。由于您的回复void
,因此存在不匹配。
如果您添加原型:
void m(void);
......在它被召唤之前,它会解决问题。
答案 1 :(得分:6)
C89允许通过将传递给它的函数和参数的返回类型隐式转换为int
来实现。请参阅here。
但是,这在C99及更高版本中无效。标准中省略了这一点。您必须为函数声明原型或在main
之前定义它。查看结果here。在这种情况下存在编译时错误。
答案 2 :(得分:3)
不,但你可以声明:
#include <stdio.h>
// declare m()
void m();
void main()
{
// use m()
m();
}
// define m()
void m()
{
printf("hi");
}
答案 3 :(得分:2)
函数声明需要在第一次调用函数之前添加。 完整声明包括返回类型以及参数的数量和类型。这也称为函数原型。
所以你缺少功能原型。
将函数声明void m();
添加到代码中。
修改强>
C程序允许使用forward declaration 。
在您的情况下,
void m();
表示函数的前向声明,是函数的原型。处理完此声明后,编译器将允许用户在程序的其余部分中引用实体m
。必须在某处提供函数的定义(相同的文件或其他文件,链接器负责将一个或多个目标文件中的特定函数的引用与其定义正确匹配,其定义必须是唯一的,在另一个中) :(来自维基百科页面)
这就是在你的程序中主要工作之后定义函数的原因。
答案 4 :(得分:2)
是 - 使用原型进行调用。
即。把
void m();
在文件的开头
答案 5 :(得分:1)
我会说,是的。
但我想纠正你,并说明在 之前可以调用(调用)某些函数(HOISTING)。
我想写的两种不同类型的函数是:
表达功能&amp;减速功能
1-表达式函数:函数表达式可以存储在变量中,因此它们不需要函数名称。它们也将被命名为匿名函数(没有名称的函数)。要调用(调用),他们总是需要使用变量名。如果在定义之前调用,则这些函数不会起作用,这意味着此处不会发生提升。我们必须首先定义表达式函数然后再调用它。
let lastName = function (family) {
console.log("My last name is " + family);
};
let x = lastName("Lopez");
这是你在ES6中写的方式:
lastName = (family) => console.log("My last name is " + family);
x = lastName("Lopez");
2-减速功能:使用以下语法声明的功能不会立即执行。它们被保存以供以后使用&#34;,并且在它们被调用(被调用)时将被执行。如果你在定义它们之前或之后调用它们,这些类型的函数都有效。如果在定义之前调用减速功能 - 提升 - 正常工作。
function Name(name) {
console.log("My cat's name is " + name);
}
Name("Chloe");
吊装示例:
Name("Chloe");
function Name(name) {
console.log("My cat's name is " + name);
}