c - 警告:'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
解决方案
根据 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标识符列表是函数参数的标识符列表,没有类型。n
invoid print(n)
是一个标识符列表。
2声明列表是在)
结束函数参数和{
开始函数体之前的声明列表。print
问题代码中函数的声明列表为空。
推荐阅读
- sockets - 为什么我发的频率越低越容易丢包?
- javascript - 我的响应式导航栏无法正常工作
- huggingface-transformers - 在 Huggingface 转换器管道中使用非默认模型时出现 KeyError
- python - 如何在python中获取多个带有符号的股票报价
- python - 根据匹配的列名和列值提取行值
- java - Firebase 处理嵌套数据
- ionic-framework - Ionic Appflow 部署失败并出现 api 访问错误
- php - 如何在 Symfony 5 中获取项目或根目录
- javascript - _worker.default 不是 react js 中的构造函数
- python - 通过列表理解没有得到正确的结果