C语言中的几个易错点-课堂笔记
Posted zsytony
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中的几个易错点-课堂笔记相关的知识,希望对你有一定的参考价值。
目录
一些需要注意和思考的点
1. 全局变量与局部变量:
#include <iostream>
//file 1
double g_a;
int main()
//double a;
std::cout << g_a << std::endl;
//std::cout << a << std::endl;
getchar();
return 0;
- 全局变量
g_a
在定义时会被清空,输出值会是0 - 局部变量
a
如果只定义不赋值,编译不通过,提示错误
2. extern在变量和函数中的使用
错误代码如下
//file 1
#include <iostream>
double g_a;
int fun();
int main()
std::cout << g_a << std::endl;
fun();
getchar();
return 0;
====================================
//file 2
#include <iostream>
double g_a;
int fun()
std::cout << g_a << std::endl;
return 0;
file2
中使用g_a
变量时会报错:
fatal error LNK1169
因为变量在file1中已经被定义过了,这里产生了重复定义的错误。
正确的使用方法是fil2中 的double g_a
前加上extern
,也即extern double g_a
。
extern
详解:
- 变量:
- 若file2文件要引用file1中已经定义过的变量
double g_a
,需要在变量的声明前加上extern
,然后就能引用变量g_a
,file2引用到该变量,一方面声明extern
,另一方面g_a
也必须能够被引用。 - 变量的作用域,通常能够以
extern
修饰符引用的变量都是全局变量。另外,extern double g_a
可以放在file2的任何地方
- 若file2文件要引用file1中已经定义过的变量
- 函数:
- 函数名是指向函数二进制块开头出的指针,如果file2 要引用file1中的函数
int fun(int a)
,需要在file2中声明extern int fun(int a)
就可以使用,不过在C/C++中,extern
通常是默认隐式的。不写时默认为外链接(external) - 对其他文件模块中函数的引用常用的方法是包含这些函数声明的头文件,但是使用外链接的这种方式更为简洁,而且会加速程序的编译(准确讲叫做预处理)的过程,节省时间,在大型的C程序编译过程中,这种方式带来的效率提升还是十分明显的。
- 函数名是指向函数二进制块开头出的指针,如果file2 要引用file1中的函数
- 指示调用规范:
- 比如在C++中调用C库函数,就需要在C++程序中用
extern “C”
声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。
- 比如在C++中调用C库函数,就需要在C++程序中用
补充:
变量声明和变量定义的区别:
- 变量定义:
- 数据类型+变量名称
- 编译器需要给其分配内存单元
- 变量声明:
extern 变量类型 变量名称
- 告诉编译器,此变量在外部C文件中定义,为只在外部使用它
- 编译器不会给其分配内存空间。
函数声明和函数定义的区别:
- 函数定义:
- 编写函数功能实体,编译器要编译这个函数并且分配内存空间
- 函数声明:
- 不生成函数实体,告诉编译器后面会定义实体,这里只是提前使用。
未完待续。。。。。。。。
以上是关于C语言中的几个易错点-课堂笔记的主要内容,如果未能解决你的问题,请参考以下文章