我相信你已经知道,你的m̀picc
编译器是一个真正编译器的包装器,在你的情况下显然是gcc
。
在你的示例中,你将inlinetest
定义为main
中的嵌套函数。
嵌套函数是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嵌套函数,所以就不要费心了。
8*4
代替了inlinetest(8)
。它不允许在函数内部定义一个函数。 - undefinedinline
的作用,但还是很惊讶为什么这样也能工作... - undefined