Updates from 五月, 2009 Toggle Comment Threads | 键盘快捷键

  • admin 11:50 on 2009-05-11 链接地址 | 回复
    Tags: C++编译   

    VisualC++编译器中混合.c文件时收到C1853 

    当 Visual C++ 项目启用了预编译头 (Precompiled header) 功能时,如果项目中同时混合有 .c 和 .cpp 源文件,则可能收到 C1853 编译器错误:fatal error C1853: ‘pjtname.pch’ precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C (or vice versa)(致命错误C1853:  “filename.pch”预编译头文件来自编译器的早期版本,或者预编译头为C++ 而在C 中使用它(或相反))。

    该错误是因为当项目中混合了 .cpp 和 .c 文件时,编译器会对它们采取不同的编译方式(主要是因为对函数声明的处理方式不同),因而不能共用一个预编译头文件。在 VC++ 中,默认的预编译头文件是针对 C++ 的 (stdafx.h 和 stdafx.cpp),当然也可以创建针对 C 的预编译头。有趣的是,在旧版的 VC++ 中,这个错误的提示很具有误导性:fatal error C1853: ‘xxx.pch’ is not a precompiled header file created with this compiler. 常常让人摸不着头脑。应该说,在新版中的这个提示是有所改进的。不过在网上搜索一番,对这个问题往往都是建议对整个项目取消预编译头的设置。这显然不是一个好的解决方案。对于一个比较大的工程来说,使用预编译头可以使总的编译时间大大减少。因而保留预编译头的设置才是比较好的解决方案。搜索 MSDN,针对不同的情况,可以有不同的解决方案:

    方案1:适用于绝大多数文件是 .cpp 或绝大多数文件是.c的情况。在这种情况下,将少数的不同类文件设为不使用预编译头是比较平衡的做法,方法是:对于 VC++6.0,在 FileView 里对要取消预编译头的 .c (或 .cpp) 文件点右键,选择 settings,在弹出的对话框右边选择 category 为 precompiled headers,再设置选项为 not using …;对于 VS2005,则在 solution explorer 中对相应文件点右键选择 properties,在 precompiled headers 项下设置 not using… 即可。如果需要设置多个文件,则可以按住 Ctrl 键再同时选中这些文件并设置

    方案2:如果受影响的文件比较多,则把它们都设置禁止预编译头的话仍然会使项目总体的编译速度大大降低,得不偿失。这时考虑可以为这组文件建立专用的预编译头。在 VC++ 极早期版本(1.5及以前版本)中是支持单个工程中建立分别针对 .c 和 .cpp 的预编译头的,但之后的版本中只支持单独的预编译头。在这种情况下,我们可以在workspace(或 solution)中建立一个新的静态链接库 (Static Library) 工程,将所有的 .c 文件独立出来加入到该工程中单独编译,这样就可以在该静态链接库中针对 .c 文件创建预编译头。但是这样做在一定程度上需要被独立出来的代码在逻辑上是属于同一模块中的,这样才便于维护。不过从设计的角度来说,这个要求一般是满足的,否则就应考虑下项目的总体设计了 最后别忘了设置原项目的依赖项 (dependency) 为独立出来的这个静态库项目。

     
  • admin 11:49 on 2009-05-11 链接地址 | 回复
    Tags: Visual Assist X   

    Visual Assist X 

    Visual C++的一个 插件

    非常好的vc插件,自动识别各种关键字,系统函数,成员变量,自动给出输入提示,自动更正大小写错误,自动标示错误,等等啦……

    PChome下载

    http://download.pchome.net/development/c/detail-10255-1.html

    官方网站

    http://www.wholetomato.com/downloads/CheckForUpdate.asp?v=1640&e=&b=n

    下载Part1 下载Part2

     
    • luo 13:45 on 2009-08-18 链接地址

      这个插件用了很多年了,还不错。
      我是在vckbase.com 下载的, 上面还有.net版本的 vc assist,

  • admin 11:45 on 2009-05-11 链接地址 | 回复
    Tags: Doxygen   

    doxgen 代码注释文档生成工具 

    doxygen是一个程式的文件产生工具,可将程式中的特定注解转换成为说明文件。通常我们在写程式时,或多或少都会写上註解,但是对於其他人而言,要直接探索程式裡的註解,与打捞铁达尼号同样的辛苦。通常我们在写程式时,或多或少都会写上注解,但是对于其他人而言,要直接探索程式里的注解,与打捞铁达尼号同样的辛苦。大部分有用的註解都是属於针对函式,类别等等的说明。大部分有用的注解都是属于针对函式,类别等等的说明。所以,如果能依据程式本身的结构,将註解经过处理重新整理成為一个纯粹的参考手册,对於后面利用您的程式码的人而言将会减少许多的负担。所以,如果能依据程式本身的结构,将注解经过处理重新整理成为一个纯粹的参考手册,对于后面利用您的程式码的人而言将会减少许多的负担。不过,反过来说,整理文件的工作对於您来说,就是沉重的负担。不过,反过来说,整理文件的工作对于您来说,就是沉重的负担。

    一个好的程式设计师,在写程式时,都会在适当的地方加上合适的註解。一个好的程式设计师,在写程式时,都会在适当的地方加上合适的注解。如果,能够在撰写註解时,稍微符合某种格式,接著就可以透过一个工具程式依据程式结构及您的註解產生出漂亮的文件。如果,能够在撰写注解时,稍微符合某种格式,接着就可以透过一个工具程式依据程式结构及您的注解产生出漂亮的文件。这将令许多工作繁重的程式设计师有时间多喝几杯咖啡。这将令许多工作繁重的程式设计师有时间多喝几杯咖啡。

    Doxygen 就是这样的一个工具。Doxygen就是这样的一个工具。在您写註解时,稍微按照一些它所制订的规则。在您写注解时,稍微按照一些它所制订的规则。接著,他就可以帮您產生出漂亮的文件了。接着,他就可以帮您产生出漂亮的文件了。 因此,Doxygen 的使用可分為两大部分。因此,Doxygen的使用可分为两大部分。首先是特定格式的註解撰写,第二便是利用Doxygen的工具来產生文件。首先是特定格式的注解撰写,第二便是利用Doxygen的工具来产生文件。

    目前Doxygen可处理的程式语言包含:目前Doxygen可处理的程式语言包含:

    C/C++C/C++
    JavaJava
    IDL (Corba, Microsoft及KDE-DCOP类型)  IDL(Corba,Microsoft及KDE-DCOP类型)   
    而可產生出来的文件格式有:而可产生出来的文件格式有:

    HTMLHTML
    XMLXML
    LaTeXLaTeX
    RTFRTF
    Unix Man PageUnixManPage
    而其中还可衍生出不少其他格式。而其中还可衍生出不少其他格式。 如有了LaTeX 文件后,就可以透过一些工具產生出PS或是PDF档案。如有了LaTeX文件后,就可以透过一些工具产生出PS或是PDF档案

     

    下载Part1   下载Part2

     
  • admin 11:44 on 2009-05-11 链接地址 | 回复
    Tags: pclint   

    C++语言代码检查工具PC-Lint四步速成 

    概述

    PC-Lint是一个历史悠久,功能异常强劲的静态代码检测工具。它的使用历史可以追溯到计算机编程的远古时代(30多年以前)。经过这么多年的发展,它不但能够监测出许多语法逻辑上的隐患,而且也能够有效地帮你提出许多程序在空间利用、运行效率上的改进点,在很多专业级的软件公司,比如 Microsoft, PC-Lint检查无错误无警告是代码首先要过的第一关,我个人觉得,对于小公司和个人开发而言,PC-Lint也非常重要,因为基于开发成本考虑,小公司和个人往往不能拿出很多很全面的测试,这时候,PC-Lint的强劲功能可以很好地提高软件的质量。

      功能

    1) PC-Lint是一种静态代码检测工具,可以说,PC-LINT是一种更加严格的编译器,不仅可以象普通编译器那样检查出一般的语法错误,还可以检查出那些虽然完全合乎语法要求,但很可能是潜在的、不易发现的错误。

      2) PC-lint不但可以检测单个文件,也可以从整个项目的角度来检测问题,因为C语言编译器固有的单个编译,这些问题在编译器环境下很难被检测,而PC-Lint在检查当前文件的同时还会检查所有与之相关的文件,可想而知,它会对我们有很大的帮助。

      3) PC-lint支持几乎所有流行的编辑环境和编译器,比如Borland C++从1.x到5.x各个版本、Borland C++ Build、GCC、VC,VC.net、watcom C/C++、Source insight、intel C/C++等等,也支持16/32/64的平台环境。

      4) 支持Scott Meyes的名著(Effective C++/More Effective C++)中说描述的各种提高效率和防止错误的方法。

      四步速成PC-Lint概述

    这么好的工具,当然是先拿起来用了再说,这里分为四步,保证你马上可以使用PC-Lint了,当然,如果你上手以后,想细致深入学习这个工具,可以在网上查找相应的资料,另外在我的另一个系列文章《软件开发的七种武器》中有一篇是讲述 PC-Lint使用的,比这篇要深入细致一些,如有兴趣,也可以看看。

      第一步:安装&设置

      安装和通常的软件没有什么不同。安装结束后在PC-Lint安装目录下运行CONFIG.exe,各项设置简要解释如下:

      a) 第一步,给出PC-Lint的安装路径和选择设置的保存文件。

      b) 第二步,选择你所使用的C/C++编译器:比如Visual C++ 6.x。

      c) 第三步,选择内存模式:比如32 bit Flat Model。

      d) 第四步,选择所使用的库:比如MFC,OWL,等,可多选,在windows下开发的一般要选中windows 32 bit。

      e) 第五步,C++编程提出过重要建议的作者,选择某作者后,他提出的编程建议方面的选项将被打开:比如Scott Meyers,可不选。

      f) 第六步,头文件的设置:可在后面步骤中手工添加。

      第二步:整合PC-Lint到选定的编译环境

    当你在上述第二步中选择了编译器后,可以在PC-Lint目录下找到一个”env-选用的编辑环境.lnt”文件,比如对于Source insight 是env-si.lnt,对于vc6是env-vc6.lnt。打开此文件,根据上面的描述,配置你的编译器,下面以VC6为例:

      ·选取菜单 tools | customize…..

      ·选取 Tools 标签

      ·点按主对话框上方的虚线小方框 New

      ·输入 name: PC-LINT

      ·输入 Command: c:\lint\lint-nt.exe,假设安装到此路径

      ·输入 Arguments: c:\lint\std.lnt ?(FilePath)?7)选择 (x) Use Output Window

      ·Close

     

    pc-lint
    http://www.gimpel.com/html/ptch90.htm#colnt
    http://www.7747.net/Article/200811/30399.html

    附件中,可以用命令行 检查所有c++文件

    下载

     
  • admin 11:41 on 2009-05-11 链接地址 | 回复
    Tags: Release   

    Visual C++ 2008“系统无法执行指定的程序”的解决方法 

    在没安装Visual C++ 2008的机器上运行C++ 2008编译的程序会提示“由于应用程序配置不正确,应用程序未能启动。重新安装驱动程序可能会纠正这个问题。”,如果是命令行运行,会提示“系统无法执行指定的程序”。解决方法是拷贝“%ProgramFiles%\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\”下的C++再分发文件到程序目录下,或者其它windows能搜索到的路径(比如windows\system32)下就好了。

    debug需要这个目录下的文件

    %ProgramFiles%\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT\

    在用Release编译出来的exe文件解决
    http://www.microsoft.com/downloads/results.aspx?pocId=&freetext=c%2b%2b%202005%20Redistributable%20Package&DisplayLang=en#

    可以安装 Microsoft 的 再分发包 解决此问题

     
  • admin 11:38 on 2009-05-11 链接地址 | 回复
    Tags: CPP, 内存对齐   

    内存对齐(Struct Member Alignment) 

    什么是内存对齐

        考虑下面的结构:

             struct foo
             {
               char c1;
               short s;
               char c2;
               int i;
              };
       
        假设这个结构的成员在内存中是紧凑排列的,假设c1的地址是0,那么s的地址就应该是1,c2的地址就是3,i的地址就是4。也就是
        c1 00000000, s 00000001, c2 00000003, i 00000004。

        可是,我们在Visual c/c++ 6中写一个简单的程序:

             struct foo a;
        printf(“c1 %p, s %p, c2 %p, i %p\n”,
            (unsigned int)(void*)&a.c1 – (unsigned int)(void*)&a,
            (unsigned int)(void*)&a.s – (unsigned int)(void*)&a,
            (unsigned int)(void*)&a.c2 – (unsigned int)(void*)&a,
            (unsigned int)(void*)&a.i – (unsigned int)(void*)&a);
        运行,输出:
             c1 00000000, s 00000002, c2 00000004, i 00000008。

        为什么会这样?这就是内存对齐而导致的问题。

    为什么会有内存对齐

        以下内容节选自《Intel Architecture 32 Manual》。
        字,双字,和四字在自然边界上不需要在内存中对齐。(对字,双字,和四字来说,自然边界分别是偶数地址,可以被4整除的地址,和可以被8整除的地址。)
        无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。
        一个字或双字操作数跨越了4字节边界,或者一个四字操作数跨越了8字节边界,被认为是未对齐的,从而需要两次总线周期来访问内存。一个字起始地址是奇数但却没有跨越字边界被认为是对齐的,能够在一个总线周期中被访问。
        某些操作双四字的指令需要内存操作数在自然边界上对齐。如果操作数没有对齐,这些指令将会产生一个通用保护异常(#GP)。双四字的自然边界是能够被16 整除的地址。其他的操作双四字的指令允许未对齐的访问(不会产生通用保护异常),然而,需要额外的内存总线周期来访问内存中未对齐的数据。

    编译器对内存对齐的处理

        缺省情况下,c/c++编译器默认将结构、栈中的成员数据进行内存对齐。因此,上面的程序输出就变成了:
    c1 00000000, s 00000002, c2 00000004, i 00000008。
    编译器将未对齐的成员向后移,将每一个都成员对齐到自然边界上,从而也导致了整个结构的尺寸变大。尽管会牺牲一点空间(成员之间有空洞),但提高了性能。
    也正是这个原因,我们不可以断言sizeof(foo) == 8。在这个例子中,sizeof(foo) == 12。

    如何避免内存对齐的影响

        那么,能不能既达到提高性能的目的,又能节约一点空间呢?有一点小技巧可以使用。比如我们可以将上面的结构改成:

    struct bar
    {
        char c1;
        char c2;
        short s;
        int i;
    };
        这样一来,每个成员都对齐在其自然边界上,从而避免了编译器自动对齐。在这个例子中,sizeof(bar) == 8。

        这个技巧有一个重要的作用,尤其是这个结构作为API的一部分提供给第三方开发使用的时候。第三方开发者可能将编译器的默认对齐选项改变,从而造成这个结构在你的发行的DLL中使用某种对齐方式,而在第三方开发者哪里却使用另外一种对齐方式。这将会导致重大问题。
        比如,foo结构,我们的DLL使用默认对齐选项,对齐为
    c1 00000000, s 00000002, c2 00000004, i 00000008,同时sizeof(foo) == 12。
    而第三方将对齐选项关闭,导致
        c1 00000000, s 00000001, c2 00000003, i 00000004,同时sizeof(foo) == 8。

    如何使用c/c++中的对齐选项

        vc6中的编译选项有 /Zp[1|2|4|8|16] ,/Zp1表示以1字节边界对齐,相应的,/Zpn表示以n字节边界对齐。n字节边界对齐的意思是说,一个成员的地址必须安排在成员的尺寸的整数倍地址上或者是n的整数倍地址上,取它们中的最小值。也就是:
        min ( sizeof ( member ), n)
        实际上,1字节边界对齐也就表示了结构成员之间没有空洞。
        /Zpn选项是应用于整个工程的,影响所有的参与编译的结构。
        要使用这个选项,可以在vc6中打开工程属性页,c/c++页,选择Code Generation分类,在Struct member alignment可以选择。

        要专门针对某些结构定义使用对齐选项,可以使用#pragma pack编译指令。指令语法如下:
    #pragma pack( [ show ] | [ push | pop ] [, identifier ] , n )
        意义和/Zpn选项相同。比如:

    #pragma pack(1)
    struct foo_pack
    {
        char c1;
        short s;
        char c2;
        int i;
    };
    #pragma pack()

    栈内存对齐

        我们可以观察到,在vc6中栈的对齐方式不受结构成员对齐选项的影响。(本来就是两码事)。它总是保持对齐,而且对齐在4字节边界上。

    验证代码

    #include <stdio.h>

    struct foo
    {
        char c1;
        short s;
        char c2;
        int i;
    };

    struct bar
    {
        char c1;
        char c2;
        short s;
        int i;
    };

    #pragma pack(1)
    struct foo_pack
    {
        char c1;
        short s;
        char c2;
        int i;
    };
    #pragma pack()

    int main(int argc, char* argv[])
    {
        char c1;
        short s;
        char c2;
        int i;

        struct foo a;
        struct bar b;
        struct foo_pack p;

        printf(“stack c1 %p, s %p, c2 %p, i %p\n”,
            (unsigned int)(void*)&c1 – (unsigned int)(void*)&i,
            (unsigned int)(void*)&s – (unsigned int)(void*)&i,
            (unsigned int)(void*)&c2 – (unsigned int)(void*)&i,
            (unsigned int)(void*)&i – (unsigned int)(void*)&i);

        printf(“struct foo c1 %p, s %p, c2 %p, i %p\n”,
            (unsigned int)(void*)&a.c1 – (unsigned int)(void*)&a,
            (unsigned int)(void*)&a.s – (unsigned int)(void*)&a,
            (unsigned int)(void*)&a.c2 – (unsigned int)(void*)&a,
            (unsigned int)(void*)&a.i – (unsigned int)(void*)&a);

        printf(“struct bar c1 %p, c2 %p, s %p, i %p\n”,
            (unsigned int)(void*)&b.c1 – (unsigned int)(void*)&b,
            (unsigned int)(void*)&b.c2 – (unsigned int)(void*)&b,
            (unsigned int)(void*)&b.s – (unsigned int)(void*)&b,
            (unsigned int)(void*)&b.i – (unsigned int)(void*)&b);

        printf(“struct foo_pack c1 %p, s %p, c2 %p, i %p\n”,
            (unsigned int)(void*)&p.c1 – (unsigned int)(void*)&p,
            (unsigned int)(void*)&p.s – (unsigned int)(void*)&p,
            (unsigned int)(void*)&p.c2 – (unsigned int)(void*)&p,
            (unsigned int)(void*)&p.i – (unsigned int)(void*)&p);

        printf(“sizeof foo is %d\n”, sizeof(foo));
        printf(“sizeof bar is %d\n”, sizeof(bar));
        printf(“sizeof foo_pack is %d\n”, sizeof(foo_pack));
       
        return 0;
    }

     
  • admin 11:36 on 2009-05-11 链接地址 | 回复
    Tags: CLASS, Diagram, MFC   

    MFC各版本的类结构图,类层次图 

    Microsoft Foundation Class Library Version 4.21(mfc4.21类结构图)
    Microsoft Foundation Class Library Version 6.0(mfc6.0类结构图)
    Microsoft Foundation Class Library Version 7.0(mfc7.0类结构图)
    Microsoft Foundation Class Library Version 9.0(mfc9.0类结构图)

     
  • admin 11:12 on 2009-05-11 链接地址 | 回复
    Tags: book, C++, Tool   

    bbs资源整理 

    Apache2.2中文手册

    CSS3.0

    C++Primer 4th

    PCLint

    Doxygen Part1

    Doxygen Part2

    Whole Tomato Visual Assist Part1

    Whole Tomato Visual Assist Part2

     
c
写新的
j
下一篇文章/下一个回复
k
前一篇文章/以前的回复
r
回复
e
编辑
o
显示/隐藏 回复
t
回到顶部
l
go to login
h
show/hide help
shift + esc
取消