C 编程语言是否允许嵌套内联函数(按标准)?

Are nested inline functions allowed (by the standard) in C programming language?

我刚刚了解到内联函数也可以在另一个函数的主体中定义。

我正在使用 mpicc 编译器,以下代码编译成功,没有警告和错误:

#include <stdio.h>

int main() {
    inline int inlinetest(int x) {
        return x * 4;
    }

    printf("%d\n", inlinetest(8));
    return 0;
}

但是,CLion 在文件中显示以下错误:

inlinetest{括号: 此处不允许定义函数

我尝试调用 inlinetest 的地方:函数 'inlinetest' 的隐式声明在 C99 中无效

我尝试将 CMAKE_C_STANDARDC_STANDARD 设置为 11,但这并没有什么不同。

有没有办法配置 CMake 或 CLion 本身,使其不检测此 "error"?

C 标准允许嵌套函数定义,因为它允许 C 实现支持此类定义作为核心语言的扩展:符合标准的程序 可能具有嵌套函数定义但只能与支持它们的编译器一起使用。

C 语言不允许嵌套函数定义,因为它们被定义为核心语言的一部分:严格遵守的程序 没有嵌套函数定义。

对于不支持嵌套函数定义的编译器,您不能指望可以轻松地提供一个开关来“忽略”嵌套函数定义导致的错误。支持嵌套函数定义需要在编译器中进行深思熟虑的设计和工程。

C 标准不支持嵌套函数定义。一些编译器允许它们作为扩展,特别是 gcc。但是请注意,由于您的嵌套函数不引用外部函数中的局部变量,因此您可以将其定义移到外部函数的主体之外:

#include <stdio.h>

inline int inlinetest(int x) {
    return x * 4;
}

int main() {
    printf("%d\n", inlinetest(8));
    return 0;
}

另请注意,inline 可能会被编译器忽略,一些现代编译器会根据实际使用情况内联函数,即使没有 inline 关键字。

我相信你知道,你的 m̀picc 编译器是一个真正的包装器 编译器,你的情况显然是 gcc.

在您的示例中,您已将 inlinetest 定义为 main.

中的 嵌套函数

嵌套函数是 a language extension in GNU C 标准 C 不支持它们。

gcc 将使用默认选项编译您的程序:

$ cat main.c
#include <stdio.h>

int main() {
    inline int inlinetest(int x) {
        return x * 4;
    }

    printf("%d\n", inlinetest(8));
    return 0;
}
$ gcc main.c
$ ./a.out
32

但是 gcc 如果您指示它执行任何最早的 C 标准,它会抱怨:

$ gcc -std=c89 -pedantic main.c
main.c: In function ‘main’:
main.c:4:5: error: ‘inline’ undeclared (first use in this function)
    4 |     inline int inlinetest(int x) {
      |     ^~~~~~
main.c:4:5: note: each undeclared identifier is reported only once for each function it appears in
main.c:4:11: error: expected ‘;’ before ‘int’
    4 |     inline int inlinetest(int x) {
      |           ^~~~
      |           ;

最新:

$ gcc -std=c18 -pedantic main.c
main.c: In function ‘main’:
main.c:4:5: warning: ISO C forbids nested functions [-Wpedantic]
    4 |     inline int inlinetest(int x) {
      |     ^~~~~~

我不熟悉 CLion,但是 IDE 总是吹嘘即时代码分析 隐藏即时分析器不同意的潜在麻烦 与编译器在某些方面。 IDE 可能会给你一些方法来查看分析器的规则目录并调整它以消除滋扰诊断。 但我不希望您能让 CLion 识别 GNU C 嵌套函数:它们 是神秘的。

出于这个原因,我建议您不要选择这场斗争。你肯定 还没有找到一个令人信服的理由让你的代码依赖于对 GNU C 嵌套函数的支持, 所以别管他们了。