在嵌入式C中空函数的用途是什么?
我正在一个嵌入式项目中工作,该项目的源代码(C语言)中包含一个函数,用于检查以太网类型是轮询还是中断。 我们有一个如下的函数在嵌入式C中空函数的用途是什么?,c,function,C,Function,我正在一个嵌入式项目中工作,该项目的源代码(C语言)中包含一个函数,用于检查以太网类型是轮询还是中断。 我们有一个如下的函数 unsigned char mode(void); unsigned char xmode(void) { if(mode()) return 1; return 0; } 函数mode()没有主体。当函数xmode()调用函数mode()时会发生什么情况?这将导致链接失败,或者您正
unsigned char mode(void);
unsigned char xmode(void)
{
if(mode())
return 1;
return 0;
}
函数mode()没有主体。当函数xmode()调用函数mode()时会发生什么情况?这将导致链接失败,或者您正在链接的文件包含实际的
mode()
函数。在上述代码无符号字符模式(void)中
告诉编译器函数mode()
存在,它不接受任何参数,但返回一个无符号字符
这并没有真正定义函数。它只定义了调用它的方式。这个东西叫做函数原型
函数mode()
稍后在同一个文件或另一个文件(可能是程序集文件)中定义
函数原型的一个常见用途是实现递归
考虑函数a()
和b()
,它们各自调用另一个函数,并在同一文件中定义:
void a()
{
b();
}
void b()
{
a();
}
当编译器看到a()
内部的b()
时,它根本不知道b()
到底是什么或应该是什么。显然,如果您更改定义a()
和b()
的顺序,您将遇到同样的问题,但是现在a()
在b()
内部是未知的
要解决此问题,请添加一个原型:
void b();
void a()
{
b();
}
void b()
{
a();
}
现在,编译器将知道什么是b()
(函数),并知道如何调用和使用它。扩展前面的答案
这不是一个“空”函数,它是一个原型
编译器使用它来输出具有主体的函数的目标代码。它需要能够正确设置函数调用,并确保它能够处理任何转换等。目标代码将包含对函数的引用,链接器将用正确的值替换这些引用
这也意味着编译器可以为您执行错误检查,并获得比链接器更多的信息。有趣的是,C标准允许隐式声明函数
(为了清楚起见,这是简化的。)正在声明模式。希望它是在其他地方定义的。请注意,函数原型决不是嵌入式编程特有的——它们在C编程中非常常见(我的意思是,它们在今天的C编程中被广泛使用)。您可以在头文件中找到它们,尽管它们在.c文件中并不少见。