C - 警告:"n"的类型默认为"gcc"中的"int"[-Wimplicit-int]警告,但在"clang"中没有警告



我写了一个简单的代码来递归打印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函数的声明列表为空。

相关内容

  • 没有找到相关文章

最新更新