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中的函数int fun(int a),需要在file2中声明extern int fun(int a)就可以使用,不过在C/C++中,extern 通常是默认隐式的。不写时默认为外链接(external
    • 对其他文件模块中函数的引用常用的方法是包含这些函数声明的头文件,但是使用外链接的这种方式更为简洁,而且会加速程序的编译(准确讲叫做预处理)的过程,节省时间,在大型的C程序编译过程中,这种方式带来的效率提升还是十分明显的。
  • 指示调用规范:
    • 比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。

补充:
变量声明变量定义的区别:

  • 变量定义:
    • 数据类型+变量名称
    • 编译器需要给其分配内存单元
  • 变量声明:
    • extern 变量类型 变量名称
    • 告诉编译器,此变量在外部C文件中定义,为只在外部使用它
    • 编译器不会给其分配内存空间。

函数声明函数定义的区别:

  • 函数定义:
    • 编写函数功能实体,编译器要编译这个函数并且分配内存空间
  • 函数声明:
    • 不生成函数实体,告诉编译器后面会定义实体,这里只是提前使用。

未完待续。。。。。。。。


以上是关于C语言中的几个易错点-课堂笔记的主要内容,如果未能解决你的问题,请参考以下文章

Linux Bash Shell 中变量的 5 个易错点

C++ Primer笔记5---chapter5易错点

高薪前端开发都会巧妙的躲过这10个易错点!

易错的快排---qsort()

第一次作业

[Mdfs] lc797. 所有可能的路径(图遍历+dfs易错点+知识理解)