使用vc++也有一段时间了,总觉得有点乱,这下想梳理一下。
从c语言开始吧,C库函数、宏定义、结构、编译环境、函数的重构、程序的扩展。
C的标准库函数在studio.h stdlib.hstring.h中在程序中调用,真正的代码在.lib和.obj文件中,无论是vs还是其他的编译环境,可以找到和设置默认路径找到或指向这些文件。所有的最后都会定义到windows的API函数(当然前提是windows编程),windows的API函数在user32.dll等之类的dll中。这些就不用管了,交给windows了。而这只是一部分的代码如CreateFile、MessageBox之类的。还有一部份的代码由编译器直接编程汇编,while、for循环的什么的。代码的第二部分越高,速度越快。
C的宏定义,编译器预处理部分的,#if #endif #define #pragam 之类的。这些东西只在工程中出现,不会再exe、dll等编译好的文件中有。印象比较深的是
typedef struct_sss
{
int param;
........
}sss,*ptrsss
sss是指结构体,ptrsss是结构体的指针
typedef int (*fun) (int ,int)
这样就定义了函数的指针,用这个可以指向一个函数,用于回调。(“指针”一开始并没有想到它,可是不知不觉的就出来了)
还有这个#ifndef #else #endif这类语句,标志条件判断,高手的开源代码中一堆这些东西,用于各种平台,有ARM、linux、windows、OS的,实在是令人佩服(UPX的源代码就是个很好的例子)
C程序的结构,一般编译器对于.c文件是全部编译的,存放在起来,.h文件与.c文件没有直接的联系,.h文件是函数符号存在的地方,在.c中用#include来包含.h文件,这样就可以就可以知道需要引用的函数名字是什么了,用了之后,编译器就会有一定的先后算法,编译文件,程序运行时,所有的函数都已经被编译,一样的函数名字当然有一个一样的编译后的符号,指向和调用。
其实这里存在很大的问题,那就是命名空间的问题,程序太大了,函数名就不够用了,C++中用class、public、private、protect等属性以及继承和接口、泛行等来解决这个问题(其实应该就是一种函数名,更改和记录命名的一种规则-----个人认为)。
C的编译环境,我印象比较深的是用GUN的工具链可以搭建一个liunx嵌入式的编译环境,我努力了好几个星期也没搞成功,没高人指点啊,痛苦死了,大学里怎么不教了!!!在liunx下可以用make和makefile结合编译一个大一点的C工程,创建obj文件、链接obj文件、生成可执行文件,注意它的默认路径和库文件路劲,可以自己放几个库进去。
今天就到这了,有错误的地方希望大虾指正。
谢谢