我写了一个简单的代码来递归打印n数字:
1 #include<stdio.h>
2
3 void print(n)
4 {
5 printf("%dt", n);
6 if(n>=1)
7 {
8 print(n-1);
9 }
10
11 return;
12 }
13
14
15 int main()
16 {
17 int n;
18
19 print(6);
20
21return 0;
22 }
它是由clang在没有任何警告的情况下编译的,但gcc抱怨,我得到了警告:
warning: type of ‘n’ defaults to ‘int’ [-Wimplicit-int]
即使由gcc编译,代码也能完美执行。我想知道:
- 为什么我会收到警告
- 为什么编译器的行为不同
p.S。我使用以下命令来编译它们:
cc 1.c-o 1
clang 1.c-o 1
编译器的版本:
clang版本10.0.0.4ubuntu1
gcc(Ubuntu 9.3.0-17ubuntu1~20.04(9.3.0
根据C 2018 6.9.1 6中的约束条件,符合C标准的编译器必须发布缺失声明的诊断:
如果声明符包括标识符列表1,则声明列表2中的每个声明都应至少有一个声明符,这些声明符应仅声明标识符列表中的标识符,并且应声明标识符表中的每个标识符…
声明列表中n
的声明符将是n
在声明(如int n;
(中的外观。由于没有,这违反了约束,合格的编译器必须发布诊断(根据5.1.1.3.1(。
Clang的默认模式不符合C标准。您可以要求更好地遵守-pedantic
,之后Clang报告:
warning:未声明参数"n",默认为类型"int">
我建议至少使用开关-Wmost -Werror -pedantic -O3 -std=c17
。
我也更喜欢-Wno-shift-op-parentheses -Wno-logical-op-parentheses
。
脚注
1标识符列表是函数参数的标识符列表,没有类型。void print(n)
中的n
是一个标识符列表。
2声明列表是在结束函数参数的)
之后和启动函数体的{
之前的声明列表。问题中代码中print
函数的声明列表为空。