关于头文件,全局变量,extern,static

  1. 今天在复习C的时候,看到关于#include语句的一个解释,如果B 中 #include A,就是将文件A拷贝到#include A的位置中。
  2. 根据这个原理,于是做了一个实验。在头文件中定义一个变量(非静态变量),同时声明一个fun函数。再写一个fun.c文件,fun.c文件中实现了fun函数,最后写一个main.c文件调用fun函数。
  3. 三个文件的源代码如下:
test.h
#include <stdio.h>
#include <stdlib.h>

void fun();
int com;
fun.c
#include "test.h"

void fun(){
    com = 0;
}
main.c
#include "test.h"
int main(){
    com = 4;
    fun();
    printf("%d\n", com);
    return 0;
}

, 很明显在链接的时候必然会出现“multiple definition of `com‘”。一般而言也不会在头文件中定义变量和函数。只可以声明变量,比如使用static可以在头文件中声明变量。如下所示:

test.h
#include <stdio.h>
#include <stdlib.h>

void fun();
static int com;

其他两个文件不做改动,编译、链接和运行都没有报错,输出结果是4. 因为静态变量存储静态存储区,但是静态变量的作用域是一个文件,fun.c, main.c都会为com定义一个本地变量,因此,fun对com的改动不会影响main中的com. 如果希望在fun.c中的改动对main有效果,可以使用extern.

test.h
test.h
#include <stdio.h>
#include <stdlib.h>

void fun();
extern int com;
main.c
#include "test.h"

int com;
int main(){
    com = 4;
    fun();
    printf("%d\n", com);
    return 0;
}

fun.c 无须改动,此时,程序的输出结果是0。

总结以下:extern变量可以声明一个外部变量,使得编译顺利用过,但是在链接之后才得到实际的变量。每一个文件中定义的静态变量都会在静态存储区中分别分配一个空间,静态全局变量的作用域是该文件。在头文件中一般不会直接定义变量和函数,仅仅作声明。

时间: 2024-10-29 05:28:23

关于头文件,全局变量,extern,static的相关文章

[C/C++]在头文件中使用static定义变量意味着什么

文章出处:http://www.cnblogs.com/zplutor/ 看到有一位同学在头文件中这么写: 1 static const wchar_t* g_str1 = - 2 static const wchar_t* g_str2 = - 这种定义变量的方式我从来没有见过,而且它还能顺利通过编译,于是我很想知道编译器是如何处理这种变量定义的. 定义全局变量时使用static,意味着该变量的作用域只限于定义它的源文件中,其它源文件不能访问.既然这种定义方式出现在头文件中,那么可以很自然地推

定义与声明、头文件与extern总结(转)

本文转自: http://lpy999.blog.163.com/blog/static/117372061201182051413310/ http://blog.csdn.net/feitianxuxue/article/details/7204116 感谢博主,如有侵犯请告知删除  用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字? 如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include<xxx.h> (xxx.h包含了a的声明)不

extern 用法,全局变量与头文件(重复定义)

http://www.cnblogs.com/chengmin/archive/2011/09/26/2192008.html 用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字,如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include<xxx.h> (xxx.h包含了a的声明)不就可以了么,为什么还要用extern呢??这个问题一直也是似是而非的困扰着我许多年了,今天上网狠狠查了一下总算小有所获了: 头文件 首先说下头文件,其实头文件对计算

(转)全局变量、extern/static/const区别与联系

全局变量.extern/static/const区别与联系 编译单元(模块):     在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ERROR), 因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌 入式下做开发工作的话,那么你可能非常的理解编译与连接的区别! 当在VC这样的开发工具上编写完代码,点击编译按钮准备生成exe文件时,V

extern static修饰全局变量的区别

在实际开发C++项目的时候,一个项目里面往往会包含多个cpp文件,多个头文件,有时还会有c文件.由于变量的声明可以有多次,但定义只能有一次,这就不可避免地要使用extern,static关键字.弄清楚这几个关键字之间的用法和区别,能节省很多调试项目的时间,尤其是对于一些难以定位的链接错误.下面分别介绍: 一.extern关键字 这个关键字可能是最容易用错的一个,一方面可能是因为平时写的小程序不太会用到这个关键字,另一方则是这个关键字确实有些不太容易理解的用法. extern关键字主要有两个作用:

C语言extern的使用以及头文件*.h的内容格式注意

用VS2013 分开写多文件的程序,出现了许多重定义的问题,总结解决方法如下: 在*.h文件中使用以下的格式: #ifndef <标识> #define <标识> ...... ...... #endif <标识>在理论上来说可以是自由命名的,但每个头文件的这个"标识"都应该是唯一的.标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的"."也变成下划线,如:stdio.h #ifndef _STDIO_H_ #def

头文件定义全局变量等问题

全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 可以,在不同的C文件中以static形式来声明同名全局变量.头文件中不可以直接定义变量和函数,但是可以定义static变量.类. extern用法,全局变量与头文件(重复定义) 用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字,如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include<xxx.h>(xxx.h包含了a的声明)不就可以了么,为什么还要用extern呢??这个问题一

头文件定义全局变量等问题 (转载)

全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 可以,在不同的C文件中以static形式来声明同名全局变量.头文件中不可以直接定义变量和函数,但是可以定义static变量 ,类. extern 用法,全局变量与头文件(重复定义) 用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字,如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include<xxx.h> (xxx.h包含了a的声明)不就可以了么,为什么还要用extern呢??这个

链接(extern、static关键词\头文件\静态库\共享库)

原文链接:http://www.orlion.ga/781/ 一. 多目标文件的链接 假设有两个文件:stack.c: /* stack.c */ char stack[512]; int top = -1; void push(char c) {         stack[++top] = c; } char pop(void) {         return stack[top--]; } int is_empty(void) {         return top == -1; }