第二篇 使用各类C Run-time library运行时库

来源:互联网 发布:广联达计价软件使用 编辑:程序博客网 时间:2024/06/03 12:10
一 概论
        C运行时库最早的版本出现于70年代,这个时候的应用程序都是单线程,所以运行时库也是单线程的。但是这样的运行时库不能满足现在的需求。现在的C运行时库有多个全局变量,例如errno和静态变量,这可能在多线程程序中引起冲突。例如 两个线程都设置了errno变量,后设置的将会覆盖现设置的,使得用户得不到正确错误信息;另外一个例子是假如有两个module同时静态连接了运行时库,则在内存中会有两套运行时库,有两套全局变量,这样会造成一个module对全局变量的设置值不能被另一个module读取。
        为了解决多线程的问题,首先vc++提供了两种版本的C运行时库,一个用于单线程,一个用于多线程。多线程库对单线程库的主要区别就是:1 类似errno的全局变量,每个线程单独设置一个; 2 多线程库中的数据结构一同步机制加以保护。
        另外,VC++提供的多线程运行时库又分为静态连接库和动态连接库两类,而每类运行时库又分为debug版和release版。这样,VC++就提供了一共6个 C运行时库:
        LIBC.LIB:      Single thread static link             LIBCD.LIB: Debug single thread static link
        LIBCMT.LIB:  MultiThread static link               LIBCMTD.LIB: Debug multiThread static link
        MSVERT.LIB: MultiThread dynamic link            MSVERTD.LIB: Debug muitiThread dynamic link
 
二 各类C运行时库的区别及使用方法
    1 LIBC.LIB :静态连接的单线程库,只能用于单线程的应用程序。C运行时库的目标代码最终被编译在应用程序的二进制代码中。
                     编译选项 : /ML
    2 LIBCMT.LIB:静态连接的多线程库,最终目标代码被编译在应用程序的二进制文件中,但是可以在多线程程序中使用。
                     编译选项:  /MT
    3 MSVERT.LIB:动态连接的多线程版,将所有的C库函数保存在一个单独的动态连接库MSVCRTxx.DLL中。
                     编译选项:  /MD
        如果是使用debug runtime library ,则编译选项分别为 /MLd, /MTd, /MDd。 调试版本的运行时库包含了调试信息,并采用了一些保护机制帮助发现错误,加强了对错误的检测,因此运行性能较慢。
 
三 一个典型的错误例子
    注意在MFC的CFile的输入输出,已经包含了多线程代码。所以使用CFile时必须使用多线程库。如果选择了单线程选项,则会出现错误信息:" Please use the /MD switch for _AFXDLL builds"  这个错误输出在AFXVER_.h中以预编译指令定义。
 
以下是例子代码:
#include <stdio.h>
#include <afx.h>
int main()
{
  CFile file;
  CString str("abc") ;
  TRY
  {
    file.Open("file.dat", CFile::modeWrite | CFile::modeCreate );
  }
  CATCH (CFileException, e)
  {
    # ifdef _DEBUG
    afxDump <<"file opening failed" <<e->m_cause<<"/n" ;
    # endif
  }
  END _CATCH
 
  file.Write(str, str,GetLength()) ;
  file.Close() ;
 
}
     代码vc6 xp2下通过测试
原创粉丝点击