查看注释以查看被称为声明的内容。 如果缺少整个变量声明部分,那会是什么问题?
似乎可以像示例中那样同时或分别进行变量定义和初始化。
#include <stdio.h>
// Variable declaration:
extern int a, b;
extern int c;
extern float f;
int main () {
/* variable definition: */
int a, b;
int c;
float f;
/* actual initialization */
a = 10;
b = 20;
c = a + b;
printf("value of c : %d \n", c);
f = 70.0/3.0;
printf("value of f : %f \n", f);
return 0;
}
答案 0 :(得分:2)
如果缺少该声明,则它将不会在main
函数中造成任何问题,因为局部定义的变量a,b,c,f
将在main
的功能中使用,直到其作用域结束。 / p>
声明仅告诉您定义位于其他.c
文件中的其他位置,或者该定义位于同一main
文件中函数.c
之后。
答案 1 :(得分:2)
如果缺少上述声明,这里将没有问题。
// Variable declaration:
extern int a, b;
extern int c;
extern float f;
这告诉编译器这些变量是在其他位置(在另一个文件中)定义的。
/* variable definition: */
int a, b;
int c;
float f;
在这里定义变量,但它们与声明的外部变量不同,因为它们在主函数的内部范围内。
作用域是变量所在的地方。 extern
关键字指出范围是全局的。
您可以在内部范围内定义具有相同名称的变量,并像在main函数中那样仅访问它们,但这不是一个好习惯。
void foo()
{
int a = 5;
printf("%d\n", a); // 5
// Creating an inner scope
{
int a = 20;
printf("%d\n", a); // 20
}
printf("%d\n", a); // 5
}
将extern
关键字与变量一起使用的正确方法是这样的。
//h1.h
extern int global_var; // Declaration of the variable
//c1.c
#include h1.h
int global_var = 0; // Definition of the global var. Memory is allocated here.
//main.c
#include h1.h
int main()
{
printf("global var value is %d\n", global_var); // use of the var defined and
// initialized in c1.c
return 0;
}
由于该变量是在c1.c中定义和初始化的,因此该程序将打印0
。
答案 2 :(得分:1)
Extern扩展了C变量和C函数的可见性。这样一来,让编译器知道在另一个地方声明了这些var,并在其他地方为它们分配了内存。 例如在另一个c文件中。 例如,如果编译包含全局变量的c文件: 整数c = 5; 然后在使用此c var的c文件上创建一个函数,例如:
int someFunc(void){
return c;}
如果在主目录中运行someFunc并打印其返回值,将得到5。但是必须将两个c文件一起编译。 在程序中,您仅使用在主函数中声明的本地分配的var。
答案 3 :(得分:0)
当涉及简单变量时,声明和定义之间实际上没有区别。在结构和功能上有所不同。这是一个示例:
// Declarations
struct myStruct;
int foo();
int main()
{
...
}
// Definitions
struct myStruct {
int a, b;
};
int foo() {
return 42;
}
在您的情况下,您将隐藏先前的声明,以便在作用域结束之前无法访问它们。这通常称为 shadowing 。基本上是这样:
int main()
{
int i=0;
printf("i: %d\n", i);
{
int i=42; // Now the previous i is inaccessible within this scope
printf("i: %d\n", i);
}
// And now it is accessible again
printf("i: %d\n", i);
}