C语言变量的定义和声明

  今天犯了一个低级的错误,在头文件中定义了一个变量,而该头文件被多个源文件调用,导致该变量重复定义。然后我就把改变量改成static类型的了,这下编译倒是不出错了,就是结果跟我想象的不一样,在一个文件中改了,而在另一个文件用的时候,结果为0.

  然后发现这个错误好低级,正确的用法是在源文件中定义,在头文件中声明,而别的源文件想用,就引用该头文件。

  我们来说说定义和声明的关系:

  定义:指有这么个东西,而且就放在这。

  声明:仅仅指有这么个东西,它是在别的文件中定义的。

  所以定义只能一次,而声明是可以多次的,在编译器编译的时候,只有变量定义的文件所生成的中间文件会有该变量的信息,其它声明该变量的文件中,不会有该变量。

  其实还遗留了一个问题,为什么在头文件中用static修饰变量就不会报重复定义的错误了?

  这是因为每个包含该头文件的源文件中都会有一个属于它们自己的变量,注意:虽然只在头文件中定义了一次,实际的结果是每个包含该头文件的源文件都会定义一个相同名字的变量,但是有多少源文件引用,就定义了多少个变量,而且每个源文件只能访问属于它自己的变量(因为是static的)。

时间: 2024-08-09 02:02:24

C语言变量的定义和声明的相关文章

C语言中的定义与声明

什么是定义?什么是声明?它们有何区别? 举个例子: 1 2 A)int i; B)extern int i;(关于extern,后面解释) 哪个是定义?哪个是声明?或者都是定义或者都是声明?我所教过的学生几乎没有一人能回答上这个问题.这个十分重要的概念在大学里从来没有被提起过! 什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名.但注意,这个名字一旦和这块内存匹配起来(可以想象是这个名字嫁给了这块空间,没有要彩礼啊

【编程语言】变量的定义以及与extern声明的区别

变量的定义与声明的区别 首先,变量的定义一定是发生在变量声明(extern)之前,变量的声明可以有多个,但是变量的定义只有一种,变量的声明影响变量的引用和作用域,而变量的定义则只是单方面的创建变量以及初始化赋值等,若变量再定义时没有初始化,则会在文件执行编译的时候随机赋值 1)变量在定义时分配内存空间,同时也可能进行赋初值 2)变量在声明时不会分配内存空间,变量的声明只是声明变量存在,可能引用其他文件中位置的声明变量,其作用是声明变量是在已定义的变量后面进行的 变量分为变量名和变量值 变量名的地

C类型和存储方式的语言变量

变量的作用域:有效射程变量 >局部变量 1.在函数中的局部变量,量在该函数结束后自己主动撤销 2.函数内的复合语句中的局部变量(比方for语句),这个变量在复合语句结束后自己主动撤销.这个变量能够与1中的变量重名,在复合语句作用域中里面定义的变量权限更高,考虑到可读性不推荐这么做 比如: #include<stdio.h> #include<stdlib.h> void fun1(); int main() { fun1(); } void fun1() { int m=20

定义和声明的区别

感言:我马上大三了,对计算机也算是有点感兴趣,但一直以来我对变量的定义和声明都很模糊,最开始看书上是这样讲的:定义-->就形如 int a;这就是定义了一个整形变量,然后就说变量的定义只能是一次而声明却可以多次,然后就没,我也问了好几个老师,他们也都是这样说的,我在网上搜的答案也感觉讲得不是很细,所以我总觉得这不是我想要的答案,直到我看了<<C陷阱与缺陷>>后才明白了原来里面还是有很多值得深挖的地方,所以分享给大家,我的所以的例子都是在VC6.0下实验的,先来看第一个例子:

Java中定义和声明

Java中最基本的就是定义变量和声明变量. 定义和声明的区别: 声明是向编译器介绍名字-标识符.它告诉编译器这个函数或变量在某处可以找到,它的模样像什么.而定义是说:"在这里建立变量"或"在这里建立函数".它为名字分配存储空间.无论定义的是函数还是变量,编译器都要为他们在定义点分配存储空间.对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存数据,对于函数,编译器会生产代码,这些代码最终也要占用一定的内存.基本类型变量的声明和定义(初始化)是同时产生的:而对于

C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?

报错信息:error C2065: 'salary' : undeclared identifier #include <stdio.h> void main(){ printf("我的成绩是100分!");//不使用变量 int salary;//使用变量 salary = 100; printf("我的成绩是%d分!",salary); return 0; } 问题根源:编译器问题——C89和C99 C89规定,在任何执行语句之前,在块的开头声明所有

Golang学习笔记(3)---go语言变量、常量的定义及赋值

单个变量的赋值与声明 变量的声明格式:var  <变量名称>  <变量类型> 变量的赋值格式:<变量名称> = <表达式> 声明的同时赋值:var <变量名称> [变量类型] = <表达式> <变量名> := <变量值>  --->只能在函数体内使用 多个变量的复制与声明 全局变量的声明可以使用var()的方式简写 全局变量的声明不可以省略var,但可使用并行的方式 所有变量都可以使用类型推断 并行方式的

变量定义和声明的差别(整理)

变量的声明有两种情况: 1.一种是须要建立存储空间的.比如:int a 在声明的时候就已经建立了存储空间. 2.还有一种是不须要建立存储空间的. 比如:extern int a 当中变量a是在别的文件里定义的. 声明是向编译器介绍名字--标识符.它告诉编译器"这个函数或变量在某处可找到,它的模样象什么". 而定义是说:"在这里建立变量"或"在这里建立函数".它为名字分配存储空间.不管定义的是函数还是变量,编译器都要为它们在定义点分配存储空间.对于

C语言指针与数组的定义与声明易错分析

部分摘自<C语言深度解剖> 1.定义为数组,声明为指针 在文件1中定义: char a[100]; 在文件2中声明: extern char *a; //这样是错误的 这里的extern告诉编译器a这个名字已经在别的文件中被定义了,下面的代码使用的a是在别的文件中定义的.编译器是按文件分别编译的,当a被声明为char* a时,编译器理所当然的认为a是一个指针变量,在32位系统下占用4个byte,这4个byte存放的是地址,地址指向的空间存储的是char类型数据. 程序会返回SIGSEGV. 2