我才知道内联函数也可以定义在另一个函数的主体中。
我正在使用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_STANDARD
和 C_STANDARD
到 11,但这并没有什么不同。
有没有办法配置 CMake 或 CLion 本身,让它不检测到这个 "错误"?
我相信你已经知道,你的 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 嵌套函数的支持,所以就不要去管它们了。
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
关键字