C++随笔--1)函数,外部变量的定义与声明问题,2)程序的编译问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013555238/article/details/78014406

1) 函数,外部变量的定义和声明问题

    1)(2017-9-17日目前认为) 局部变量无论定义时赋值与否 (int a 或  int a = 2),我们都可以大概认为此时 定义和 声明是一回事,但通过反汇编我们可以知道如果没有赋初值那么其实只是一种奇怪的声明,并没有定义,因为定义的概念是在存储空间中有实体。

    2) 没有static 的全局变量 称之为外部变量 (外部变量,固名思意,个人认为外部变量相当于开了上帝视角的变量,不受单个源文件篇幅限制,其作用范围可以利用extern声明扩展到任何源代码文件的任何部位)。ps: 正因为外部变量是在所有源文件之外定义的,他们的作用范围可以扩展到源文件的任意地方。所以一个外部变量只能在一个cpp中定义,但可以多个cpp中声明。

    3)函数的定义和声明:

          在C++语言中函数不能在 函数内部定义,而且函数的“定义”也需要占据存储空间(在代码区存储),所以函数(的定义)也就相当于外部变量。在函数声明时 可以显示的声明 (+extern) 而我们大多数情况下是 隐示的声明的。

    4)关于声明的理解:

          声明的作用在之前已经提到,是为了编译的顺利通过(定义是否缺失,是否重复,在链接部分执行),只要声明了 相关的函数,外部变量,程序就不会显示语法错误。声明是为了告诉编译器以下内容我在某一个地方定义了,让编译器从上到下编译时认得某些函数或者变量(外部变量)的名字(认得就行,不管是否定义),从而顺利编译。详见一下代码:ps 虽然不可以重复定义但是可以重复声明。

          comA.h 文件

namespace A{                                      //关于头文件的作用,头文件一般情况不包含函数,外部变量的定义(可能导致重复定义),只包含声明。                                                      //在编译的时候,我们只编译cpp文件,头文件的作用只是 #include到cpp文件中区。并不编译生成.obj文件

	extern void fun();                        //声明一个在 A 命名空间的 fun()函数,告诉编译器 反正我在 某个地方定义了。
		/*{                               //在不使用 命名空间时 如单纯的 void fun();,表明 声明了一个 全局命名空间的 fun()
		std::cout << "A"<< std::endl;
		}*/
	extern int x;                            //声明一个 在A命名空间中的 全局变量 x ,其定义在 其他.cpp文件中实现。让编译器 认得 A::x

}


           comA.cpp 文件

扫描二维码关注公众号,回复: 4806794 查看本文章
#include <iostream>
#include "comA.h"

void A::fun(){
	std::cout << "this is A::fun()";
}

//namespace A{
//	int x = 33333;
//}                        //注释和下一行等价,都是定义了一个 在A 中的 x = 3333

int A::x = 33333;
int x = 55555;

    main.cpp 文件
#include <stdlib.h>
#include <iostream>
#include "comA.h"




//可以重复的声明,但是不可以重复的定义  我可以连着 声明 两次 fun();

//extern int A::x;
int main(void)
{
	//std::cout<< x <<std::endl;
	std::cout<< A::x <<std::endl;

	A::fun();
	
	std::cout << "hello"<<std::endl;
	system("pause");
	return 0;
}

参考链接 我的论坛问答:问答

ps :所有源文件都需要编译,所以哪怕没有用的源文件都必须正确,因为一个工程中的,h文件在#include到.cpp之后才能起作用(被编译),所以头文件若没有被任何#include就可以有语法错误。

pps: 外部变量在.cpp编译时在静态存储区分配内存,所以如果在不同.cpp中定义了相同的外部变量,就会重复定义。



   


猜你喜欢

转载自blog.csdn.net/u013555238/article/details/78014406