为什么函数定义中的函数参数不强制提及`int`数据类型?

时间:2014-04-30 09:47:36

标签: c gcc compiler-warnings

最近我经历了一些类似的代码:(代码是专有的,因此添加了类似代码)

#include<stdio.h>

void test_it(var)
{
    printf("%d\n",var);
}

int main()
{
    test_it(67);
    return 0;
}

test_it的参数没有提到数据类型。

我将其编译为 gcc test_it.c ...:令人惊讶的是没有警告/错误

我再次编译使用: gcc -Wall test_it.c ...:没有警告/错误再次

(现在变得更具侵略性......)

我使用以下方法重新编译: gcc -Wall -Wextra test_it.c ...:
warning: type of ‘var’ defaults to ‘int’我终于得到了警告。

我尝试使用多个参数:

void test_it(var1, var2)
{
    printf("%d\n%d\n",var1, var2);
}

int main()
{
    test_it(67,76);
    return 0;
}

同样的行为!!

我也尝试过这个:

void test_it(var)
{
    printf("%d\n",var);
}

main()   // Notice that no `int` there
{
    test_it(67);
    return 0;
}

此代码仅使用-Wall选项发出警告。

所以我的问题是为什么int数据类型对于函数定义中的函数参数不是必需的?

修改

重写问题:

为什么gcc在省略函数参数的数据类型的情况下不会向-Wall发出警告,但是在省略函数返回类型时会发出警告?为什么在第一种情况下忽略它?

2 个答案:

答案 0 :(得分:5)

在C89中,默认类型假定为int。这(在C89中有效),但默认类型规则已在 C99 中放弃。看到差异:

C89 - Compiles fine

C99 prog.c:3:6: error: type of ‘var’ defaults to ‘int’

尝试使用-std=c99标志进行编译。

答案 1 :(得分:1)

默认情况下,C89中的函数参数类型为int。所以代码执行得很好 您可以查看this相关问题。