相关C程序如下:</p>
#include <stdio.h>
void testifbarisvisible();
int main()
{
void bar(int);
bar(1);
testifbarisvisible();
}
void testifbarisvisible()
{
bar(2);
}
void bar(int x)
{
printf("functionbar\n");
}
gcc 的输出是:
% gcc -std=c99 -c /tmp/notfilescope.c
/tmp/notfilescope.c: In function ‘testifbarisvisible’:
/tmp/notfilescope.c:14:2: warning: implicit declaration of function ‘bar’
/tmp/notfilescope.c:7:7: note: previous declaration of ‘bar’ was here
/tmp/notfilescope.c:14:2: error: incompatible implicit declaration of function ‘bar’
/tmp/notfilescope.c:7:7: note: previous implicit declaration of ‘bar’ was here
在我删除第 7 行中的语句后,输出为:
% gcc -std=c99 -c /tmp/notfilescope.c
/tmp/notfilescope.c: In function ‘main’:
/tmp/notfilescope.c:8:2: warning: implicit declaration of function ‘bar’
/tmp/notfilescope.c: At top level:
/tmp/notfilescope.c:17:6: warning: conflicting types for ‘bar’
/tmp/notfilescope.c:8:2: note: previous implicit declaration of ‘bar’ was here
gcc的版本是:
% gcc --version
gcc (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2)
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
我对 gcc 的两个输出之间的区别感到困惑。
这来自 gcc 的文档,“块内外部变量和函数的声明仅适用于包含声明的块。换句话说,它们与同一位置的任何其他声明具有相同的范围。”
所以我认为第 7 行的函数声明与第 14 行的函数调用没有关系。但结果表明观点是错误的。它们都是函数'bar'的隐式声明,但其中一个导致错误(函数'bar'的隐式声明不兼容),另一个导致警告('bar'的类型冲突),为什么?
这个问题让我困惑了很久。有人能帮我吗?