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

问题描述 投票:1回答:3

我才知道内联函数也可以定义在另一个函数的主体中。

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

#include <stdio.h>

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

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

然而,CLion在文件中显示了以下错误。

A the { 托架 inlinetest: 这里不允许定义功能

我想打电话的地方 inlinetest: 在C99中,隐含的函数'inlinetest'的声明是无效的。

我试着设置了 CMAKE_C_STANDARDC_STANDARD 到 11,但这并没有什么不同。

有没有办法配置 CMake 或 CLion 本身,让它不检测到这个 "错误"?

c inline clion
3个回答
1
投票

我相信你已经知道,你的 m̀picc 编译器是真正的编译器的封装器,而你的情况显然就是 gcc.

在你的例子中,你已经定义了 inlinetest 作为 嵌套函数main.

嵌套函数是 语言扩展标准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) {
      |           ^~~~
      |           ;

到最新的C标准

$ 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自诩的on-the-fly代码分析会带来潜在的麻烦,即on-the-fly分析器会在某些点上与编译器意见不一致。集成开发环境可能会给你提供一些方法来审查分析器的规则目录,并对其进行调整,以抑制讨厌的诊断。但我不希望你能让CLion识别GNU C嵌套函数:它们是神秘的。

基于这个原因,我建议你不要挑起这场战斗。您肯定没有找到一个令人信服的理由让您的代码依赖于对 GNU C 嵌套函数的支持,所以就不要去管它们了。


1
投票

C标准允许嵌套函数定义的意义在于,它允许C实现支持这种定义作为核心语言的扩展:一个 嵌套函数的定义是对核心语言的扩展:一个符合标准的程序 可以有嵌套函数定义,但只能在支持嵌套函数的编译器中使用。

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

对于一个不支持嵌套函数定义的编译器,你不能指望可以轻易地提供一个开关来 "忽略 "嵌套函数定义导致的错误。支持嵌套函数定义需要在编译器中进行刻意的设计和工程。


1
投票

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

#include <stdio.h>

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

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

还需要注意的是 inline 可能会被编译器忽略,而且一些现代编译器即使在没有使用该函数的情况下,也会根据实际使用情况对函数进行内联。inline 关键字

© www.soinside.com 2019 - 2024. All rights reserved.