1

如果编译仍然有效,是否有必要在使用变量之前声明它?

/* hello-world.c */

#include <stdio.h>

int main(void) {
    printf("Hello World!\n");
    printf("1 + 2 is: %d\n", sum(1, 2));

    return 0;
}
/* sum.c */
int sum(int a, int b) {
    return a + b;
}

gcc hello-world.c sum.c我用and编译了这些代码clang hello-world.c sum.c,都得到了警告:implicit declaration of function 'sum' 但是编译了 a.out。

是否有任何案例证明在 C 中使用之前绝对有必要声明?

(编辑:在这里,我的意思是函数原型,如果有任何混淆)

4

2 回答 2

1

用 C 语言“证明”是由 C 标准完成的,而不是通过观察编译器完成的。因为标准将很多事情留给编译器自行决定。

该程序在 C89 中有效,但在 C99 及更高版本中无效(其中未声明的标识符不能在表达式中使用)。

编译器选择对不兼容的程序做什么取决于该编译器,除了一些违规(包括这个)必须导致打印诊断。也许您的编译器选择打印诊断,然后继续表现得像 C89 。

于 2020-07-04T02:21:37.123 回答
0

经典案例是不兼容的隐式声明:

// a.c
int f()
{
    return g();
}

// b.c
float g() { return 3.14; }

在这种情况下,它是未定义的行为。

于 2020-07-04T02:29:41.653 回答