首页 > 解决方案 > 为什么我的 gcc 允许这个具有指针返回类型的空函数?

问题描述

以下函数hello 5在 Debian 上运行的 gcc 8.3 上成功编译和打印:

#include <stdio.h>

int* bar(int* x) {}

int main() {
  int x = 5;
  int* p = bar(&x);
  printf("hello %d\n", *p);
}

我对这个功能感到困惑bar。它被声明为int*但身体是空的,所以我实际上并没有告诉它返回任何东西。更令人担忧的是,为什么程序的行为就像我return x;在正文中所说的那样bar?这种行为是在某处指定的还是只是一个意外?

标签: c

解决方案


C 标准不要求使用非 void 返回类型声明的函数返回值。

该标准规定,如果函数返回时没有返回值(因为执行流向其关闭}并且使用了函数的值,则未定义行为。但是,在某些情况下,函数在某些情况下返回值而不是其他情况下是有意义的。例如,您可以拥有一个根据命令参数设置或获取值的函数:

int AccessState(int Command, SomeStructure *S,...)
{
    switch (Command)
    {
        case 0: // Get the state.
            return S->Value;
        case 1: // Set the state from the optional int parameter following S.
             va_list ap;
             va_start(ap, S);
             S->Value = va_arg(S, int);
             va_end(ap);
             break;
    }
}

这样做是不寻常的(并且可能不是好的设计),因此编译器可能会警告它。但是,为了符合 C 标准,C 实现不得拒绝控制可能到达关闭的非 void 函数}


推荐阅读