c - 是否有一个属性告诉编译器忽略缺少的 return 语句?

标签 c

我不认为这是重复的,因为函数确实返回了正确的路径。使用属性 no-return 允许编译器在函数永不返回的假设下进行优化,但这里不是这种情况。

我得到了返回指针或调用另一个函数退出程序的 C 代码。这是在 if 语句中,因此要么返回结果,要么退出。当该函数返回一个 void * 时,编译器会警告该函数可能不会返回值(这当然是真的):

错误:控制到达非 void 函数的末尾 [-Werror=return-type]

我可以通过在函数末尾添加 return *temp; 来解决这个问题,但我想通过使用诸如未使用的变量属性之类的东西来明确我的意图:

__attribute__((__unused__))

这样我就可以保留 -Wall 并且不必添加不必要的或可能令人困惑的代码。

如果有更好的方式来表达这种意图,我也愿意重写代码。

代码看起来像这样:

void *get_memory() {
    void *temp = malloc(100);
    if (temp) {
        // do some setup work
        return temp;
    } else {
        exit_program_with_epic_fail();
    }
    // Compiler warns if the following line isn't present
    return temp;
}

最佳答案

有两种方法可以消除警告:

  • 在 C11 中用适当的属性 _Noreturn 标记 exit_program_with_epic_fail() 函数,但没有可移植的方法来为 C11 之前的编译器执行此操作。许多编译器支持 __attribute__((noreturn)),特别是 gccclangtinycc,但它是一个编译器具体扩展名。
  • 重新组织代码,让编译器看到函数总是返回。

修改后的版本:

void *get_memory(void) {
    void *temp = malloc(100);
    if (!temp) {
        exit_program_with_epic_fail();
    }
    // do some setup work
    return temp;
}

关于c - 是否有一个属性告诉编译器忽略缺少的 return 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56768780/

相关文章:

c - 如何在循环中对整数使用 fgets 和 sscanf

c - C中的结构前向声明

c - 怎么可能正在使用变量但从未在 C 中定义?

将 matlab 函数转换为 C

c - 什么是运行时约束?

c - 返回值不符合预期, MIN ,编译器问题,数值溢出?

C——换档动力操作

java - 使用 PHP 运行 c/java/python?

c - 尝试打印结构元素,但结果为空白。 - C

python - "syscall-template.S: No such file or directory"是 GDB 还是我的程序的错误