首页 > 解决方案 > 警告:'n' 的类型默认为 'int' [-Wimplicit-int] 在 'gcc' 中警告,但在 '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编译,代码也能完美执行。我想知道:

PS我使用这些命令来编译它们:

抄送 1.c -o 1

铿锵声 1.c -o 1

编译器版本:

clang 版本 10.0.0-4ubuntu1
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

标签: cgccclangwarnings

解决方案


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

如果声明器包含标识符列表1,则声明列表2中的每个声明应至少具有一个声明器,这些声明器应仅声明标识符列表中的标识符,并且应声明标识符列表中的每个标识符……</p>

声明列表中的声明符 forn将出现n在声明中,例如int n;. 由于没有,这违反了约束,并且符合要求的编译器必须发出诊断(根据 5.1.1.3 1)。

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

警告:未声明参数“n”,默认为“int”类型

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

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

脚注

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

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


推荐阅读