在嵌入式C中空函数的用途是什么?

在嵌入式C中空函数的用途是什么?,c,function,C,Function,我正在一个嵌入式项目中工作,该项目的源代码(C语言)中包含一个函数,用于检查以太网类型是轮询还是中断。 我们有一个如下的函数 unsigned char mode(void); unsigned char xmode(void) { if(mode()) return 1; return 0; } 函数mode()没有主体。当函数xmode()调用函数mode()时会发生什么情况?这将导致链接失败,或者您正

我正在一个嵌入式项目中工作,该项目的源代码(C语言)中包含一个函数,用于检查以太网类型是轮询还是中断。 我们有一个如下的函数

    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文件中并不少见。