首先是关于c++和c的区分,编译器会将他们的扩展名.cpp或是.c来区分这是cpp文件还是c文件。
其次就是c++的运行分为编译和链接两个过程,任何的cpp文件会生成obj目标文件对应一个编译单元,obj是代码输出的内容,可以是二进制机器码,也可能是汇编,这些都用编译器设置输出内容决定,链接过程则会把obj(目标文件)进行链接成一个exe的可执行文件。
编译是compile,cpp文件都可以进行编译,编译不一定需要有main函数,main函数通常只做完程序的主入口地址,实际上我们一般都这么做,但是程序的入口地址不一定飞得是main函数。当试着运行c++的工程或者是build该c++工程时则会执行编译和链接两个过程,一个过程出错都会报错。
好在VS编译器给编译和链接的错误都编了号,链接错误为LXXX ,编译错误为CXXXX,这是VS编译器的特性,其他编译器如clang就没有这种特性。
当在程序的入口地址,比如main函数,写的代码是正确的,而其他地方的代码(比如函数,这里说的函数是单纯的只带返回类型和函数参数的那种)有错误但main函数程序并没有调用,链接会报错,因为从技术上说,编译器会认为你在本cpp文件未调用,但可能会在其他文件调用,可以通过告诉编译器这个函数我只在本文件使用,则可以去掉这种链接的必然性,用static关键词修饰函数,被声明只在这个cpp文件中作用。(和C中static的作用域一致)
如果本cpp文件的函数只在本文件调用,则定义函数用static修饰,如下
static int add(){
return 3+5;
}
include则是CV,单纯的复制和张贴,需要注意函数会不会重定义的问题而报链接错误,编译器找不到应该链接的函数(前提是你在头文件里写函数而不是声明),以前则会用#ifndef #endif去只加载一次这些头文件的代码,现代C++则可以用#pragma once只加载一次头文件代码
#ifndef __SYS_H_
#define __SYS_H_
#endif
//或者是
#pragma once