我用开发工具(VC6.0\.NET)写出一行一行得代码,里面包含了引用了很多的头文件(自己定义的或者c++lib里面的或者其他的),代码写好后,调试成功,生成可执行文件。我想知道,这些头文件里面的“东西”是怎么样被编译器“反映”到最后的 可执行文件里面的,编译器是怎么调用这些头文件的?win32程序最终都是依靠win32apis来实现他们的各种功能,我在程序代码里用到了c++库(lib)里面的函数(不是用来处理数据的函数诸如链表、队列函数,模板之类函数)来实现一些“实在”的功能,假如这些功能在具体在使用的时候是需要依靠api的(而我在写代码的时候是用非api函数来实现的),编译器是入如何处理这些函数代码并生成可执行文件的?这些代码在PE格式文件里面又是入如何描述的?可以列一些简单的例子吗?  写win32应用程序,就不得不考虑程序效率的问题(个人狭义的理解为完成某项功能的“快慢”问题,对否?),按照这样的理解,用apis开发(c/sdk)程序的方法和vc++/MFC开发出来的2个可以完成同样功能的程序,不考虑算法等其他因素,那个程序完成预定功能快一点?为什么?用MFC写出来的 程序是再运行的时候再托管为api函数还是再生成程序的时候已经托管好了?

解决方案 »

  1.   

    编译其实是个很复杂的过程,包括查错、编译、链接等等。有时候还需要中间文件,头文件只是为了在编译的时候告诉系统从什么地方找到适合的函数体。呵呵MFC程序肯定要执行的慢一点,因为其封装了太多的东西,并且对于消息的处理,为了支持框架,其消息的处理要经过多重判断以后才能找到对应的处理函数,呵呵,SDK中你可以在获得消息的第一时间使用你定义的处理函数。
      

  2.   

    vcleaner(我没做大哥已经很久了.......)
    讲的不错。我来说说
    "
    编译器是入如何处理这些函数代码并生成可执行文件的?这些代码在PE格式文件里面又是入如何描述的?"
    Pe 文件里面放的函数可以分成两类,一类是动态库的函数一类是静态库的函数提。
    你的代码是静态的比如mian(), WinMain,在函数里面包括的是一写代码,说白了就是汇编指令。
    也包括所谓的静态link 的lib 文件,有些lib 是包括了代码的。2类是动态库的函数,在pe 中是没有他的真正的代码的,他是放在dll,中的,在你运行的时候系统调入一些dll,然后当你需要掉函数的时候就jmp xxxxxxxx
    当调用一个函数的时候
    asm中是;
    push xxx
    push xxx
    call xxxxxx
    他有多少个参数那么call前面旧有多少个push .(stdcall方式)
      

  3.   

    各种库文件会link进你的exe文件
      

  4.   

    载入动态库后,会根据函数地址,通过汇编jmp到对应的地址空间,然后把参数压栈,等
      

  5.   

    继续追问一下,既然在编译的过程中会link进各种.h文件.lib文件,那么也就是说在得到的.exe文件中以某种方式“包含”了这些.h文件.lib文件,这样理解对吗?程序还可以加载各种。dll文件来连接某些函数,这些.dll文件应该是不包含在.exe文件内部的吧?
    程序大多数会调用操作系统的3个核心.dll,这些都是程序在运行的时候动态连接系统文件夹内这些.dll的,而不是包装在.exe内的对吗?
    小第菜的很,请各位高手指点迷津!
      

  6.   

    程序还可以加载各种。dll文件来连接某些函数,这些.dll文件应该是不包含在.exe文件内部的吧?
    程序大多数会调用操作系统的3个核心.dll,这些都是程序在运行的时候动态连接系统文件夹内这些.dll的,而不是包装在.exe内的对吗?  对,是动态就不包括代码,
    既然在编译的过程中会link进各种.h文件.lib文件,那么也就是说在得到的.exe文件中以某种方式“包含”了这些.h文件.lib文件,这样理解对吗?
    半对,.h 文件在exe 中是没有包括的,lib 是有包括的。
    .h文件是提供给cl用的。.lib 是提供给link 用的
      

  7.   

    h文件还是需要include进你的project中的
    lib会link
    dll是runtime时dynamic link的