extern 关键字声明在变量和函数之前的说明。
1、作用在变量之前
变量只允许定义一次,但可以在多个文件中声明。
Test.cpp 中:
int s32Val = 0; // 定义一个变量 s32Val,并赋初值为 0
Test1.cpp 中:
extern int s32Val; // 声明变量 s32Val,它在 Test.cpp 中被定义,此处不可赋值
Test2.cpp 中:
extern int s32Val; // 声明变量 s32Val,它在 Test.cpp 中被定义,此处不可赋值
2、作用在函数之前
Test.h:
extern void Fun(); // 函数声明,extern 用于标识次函数为外部可调用函数
Test.cpp:
void Fun(); // 函数定义
用 extern 声明外部变量是不能进行初始化:
为什么会这样呢?因为 extern int a; 只是声明而不是定义,声明是不会为变量开辟内存空间的,自然无法对其进行初始化的操作。
C/C++ 编译 cpp 文件是从上往下编译,所以 main 函数里面调用其他函数时,如果其他函数在 main 函数的下面,则要在 main 函数上面先声明这个函数。
或者把 main 函数放在最下面,这个不仅限于 main 函数,其他函数的调用都是如此。被调用的函数要在调用的函数之前声明。
变量左值可以出现在等式的左边或者右边。出现在左边可以用来判锻NULL,以防出现逻辑错误
#include "stdafx.h" int *a = NULL; int main() { if (a = NULL)//赋值语句,并非判断语句 { return false; } if (NULL = a)//!!!!ERROR 此处在程序编译阶段不通过,“=”右边不能为变量名 { return false; } if (a == NULL)//可行 ,判断指针a是否为空 { return false; } if (NULL == a)//可行 ,判断指针a是否为空。在实际项目中,为了防止将“==”误写作“=”推荐讲变量名写在右侧,编译器可以帮助寻找错误 { return false; } return 0; }
现在才算理解声明和定义的区别了:
定义包含了声明,但是声明不包含定义,如
int a = 0; //定义并声明了变量 a extern int a; //只是声明了有一个变量 a 存在,具体 a 在哪定义的,需要编译器编译的时候去找。
函数也是类似,定义的时候同时声明。但如果只是声明,编译器只知道有这么个函数,具体函数怎么定义的要编译器去找。
void fun1(); //函数声明 void fun1(){ //函数定义 cout<<"fun1"<<endl; }
感谢您的支持,我会继续努力的!
支付宝扫一扫,即可进行扫码打赏哦
1834C++ 变量类型
extern 关键字声明在变量和函数之前的说明。
1、作用在变量之前
变量只允许定义一次,但可以在多个文件中声明。
Test.cpp 中:
Test1.cpp 中:
Test2.cpp 中:
2、作用在函数之前
Test.h:
Test.cpp:
1833C++ 变量类型
用 extern 声明外部变量是不能进行初始化:
为什么会这样呢?因为 extern int a; 只是声明而不是定义,声明是不会为变量开辟内存空间的,自然无法对其进行初始化的操作。
1832C++ 变量类型
C/C++ 编译 cpp 文件是从上往下编译,所以 main 函数里面调用其他函数时,如果其他函数在 main 函数的下面,则要在 main 函数上面先声明这个函数。
或者把 main 函数放在最下面,这个不仅限于 main 函数,其他函数的调用都是如此。被调用的函数要在调用的函数之前声明。
1831C++ 变量类型
变量左值可以出现在等式的左边或者右边。出现在左边可以用来判锻NULL,以防出现逻辑错误
1830C++ 变量类型
现在才算理解声明和定义的区别了:
定义包含了声明,但是声明不包含定义,如
函数也是类似,定义的时候同时声明。但如果只是声明,编译器只知道有这么个函数,具体函数怎么定义的要编译器去找。