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

warning: type of ‘n’ defaults to ‘int’ [-Wimplicit-int] warning in 'gcc' , but no warning in 'clang'

我写了一个简单的代码来递归打印 n 个数字:

  1 #include<stdio.h>
  2 
  3 void print(n)
  4 {
  5 printf("%d\t", 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 version 10.0.0-4ubuntu1
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

根据 C 2018 6.9.1 6 中的约束(粗体和脚注是我的),符合 C 标准的编译器必须针对缺少的声明发出诊断:

If the declarator includes an identifier list1, each declaration in the declaration list2 shall have at least one declarator, those declarators shall declare only identifiers from the identifier list, and every identifier in the identifier list shall be declared

声明列表中 n 的声明符将是 nint n; 等声明中的出现。由于存在 none,这违反了约束,并且符合标准的编译器必须发出诊断(根据 5.1.1.3 1)。

Clang的默认模式不符合C标准。您可以请求更好地遵守 -pedantic,之后 Clang 报告:

warning: parameter 'n' was not declared, defaulting to type 'int'

我建议至少使用开关 -Wmost -Werror -pedantic -O3 -std=c17

我也比较喜欢-Wno-shift-op-parentheses -Wno-logical-op-parentheses.

脚注

1 标识符列表是函数参数的标识符列表,没有类型。 void print(n)中的n是标识符列表。

2 声明列表是结束函数参数的)之后和开始函数体的{之前的声明列表。问题代码中 print 函数的声明列表为空。