C - 外部、静态、包含

标签 c static extern scoping

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,即定义的行不会执行。正确吗?

生活在践踏我:(

最佳答案

在 header 中,声明变量。在例如 f1.c 中,定义变量,例如int qwe = 1;//在全局范围内。

在所有想要查看/更改qwe 的文件中,包括声明变量的 header 。简单易行。

关于C - 外部、静态、包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28968089/

相关文章:

c - 对 makefile 的递归调用不更新目标文件

c - 从链表中删除一个元素

java - 在享元模式中将静态实例分配给非静态实例

c++ - C 函数调用 C++ 成员函数 - C 代码是用 C 编译器编译的

c - 内存分配如何在不显式分配的情况下为 char* 工作

C访问冲突写入位置scanf_s

java - 如何从静态方法调用非静态方法

java - 如何从静态方法获取总计

c - 在 .h 文件中使用数组

C 在头文件中定义一个指向 extern 函数的宏函数