【发布时间】:2015-03-10 15:46:34
【问题描述】:
C 中的作用域非常混乱。我有一个变量:“int qwe”。这个 var 应该在一个或多个文件中可见 - 在本例中为 f1.c,但在另一个 f2.c 中不可见。
假设我有:main.c、f1.c、f2.c、header.h
主要: 调用 f1(); 调用 f2();
标题:
#ifndef HEADER_INCLUDED
#define HEADER_INCLUDED
int qwe = 1;
void f1();
void f2();
#endif // HEADER_INCLUDED
f1.c:
#include <stdio.h>
extern int qwe;
void f1(){
printf("In f1: %d\n", qwe);
}
f2.c:
#include <stdio.h>
static int qwe = 2;
void f2(){
printf("In f2: %d\n", qwe);
}
现在这变得令人困惑。有定义和声明。我在标题中定义了 qwe,在 f1.c 中声明了它。那是对的吗?是否应该在 f1.c 的标题和声明中进行定义?我尝试了后一种情况,但得到一个错误 - “qwe 的多重定义”。当我从 f1.c 中删除 #include 指令时,它起作用了……当我删除 extern 关键字时它也起作用。 extern 是多余的吗?
f2.c 我想它没问题并且表现如预期,或者是吗?但是,如果我在标题中添加#include,它就会中断。这是为什么呢?
我什么时候应该在源文件中使用#include?如果我不包括它 f1.c 或 f2.c 它可以工作...
另外,如果我在函数中将变量定义为静态变量,例如 static int i = 0;这个变量在函数存在时不会被破坏,它会保留它的内存和数据。下次调用相同的函数时,将可以访问它,对吗?但是 var 不会重新初始化为 0,即定义的行不会执行。对吗?
生活让我窒息:(
【问题讨论】:
-
忘记明确说明如果将#include "header" 放入f1.c,编译失败并报错:"multiple definition of qwe" and "first defined here"。这是为什么呢?
-
头文件应该包含声明,而不是定义。将定义放在 f1.c 中。不要在 f2.c 中包含头文件或使用
#define qwe qwehidden隐藏声明 -
经验法则:如果您发现自己对非常量变量使用了
extern关键字,那么您的程序设计就会被破坏。