【发布时间】:2016-06-28 11:39:15
【问题描述】:
我已经解决了以下问题:
- Global variable in C are static or not?
- Are the global variables extern by default or it is equivalent to declaring variable with extern in global?
上面的链接描述了如果我们在一个文件中定义全局变量并且没有指定extern关键字,由于翻译单元,它们将可以在另一个源文件中访问。
现在我有file1.c,其中定义了以下全局变量和函数:
int testVariable;
void testFunction()
{
printf ("Value of testVariable %d \n", testVariable);
}
在file2.c有以下代码
void main()
{
testVariable = 40;
testFunction();
}
现在我收到了error: 'testVariable' undeclared (first use in this function) -- 为什么?
注意:这两个文件都使用makefile在同一个程序中使用。
据我了解,函数和全局变量都有默认的外部链接。所以函数我们可以直接在另一个文件中使用它的名字但是变量不能为什么?
谁有想法?
编辑:
从下面的答案中,我知道就像函数旧编译器会猜测并添加隐式声明一样,但如果是变量则不能。 C99 也删除了隐式声明,但我仍然在 C99 模式下收到警告,例如:
warning: implicit declaration of function ‘testFunction’.
现在已经通过以下链接:
implicit int and implicit declaration of functions with gcc compiler
它说编译器将其作为诊断目的而不给出错误。所以编译器可以向前处理。
但是为什么在变量的情况下它不能进一步处理?即使在函数的情况下,如果编译器继续并且如果实际定义不存在,那么在链接时它也会失败。那么前进有什么好处呢??
【问题讨论】:
-
如果编译器假定每个未声明的变量都是
extern对象,那么您永远不会收到有关缺少声明的警告。另外,编译器如何知道对象的类型? -
@EOF 那么编译器在函数的情况下如何工作?
-
在旧的 C 标准中,有隐式函数声明的概念。它已从较新的标准中删除,应避免使用。您可能希望使用编译器选项进行编译以使用现代 C 标准和警告。
-
@EOF 是的,我知道我们可以通过将警告视为错误来避免它。但我的问题是为什么在变量的情况下它直接视为错误?
-
您当然可以访问它们。您只需在要访问它们的文件中声明它们。执行此操作的标准方法是将外部声明放在头文件(
.h文件)中,然后将该文件包含在您要使用它们的位置。
标签: c global-variables extern