设置编译器选项

设置编译器选项

对于C++/Zi使编译器开启PDB(program database)PDB包含类型信息(type information)和符号调试信息(symbolic debugging information)。符号调试信息(symbolic debugging information)是关于变量的名字和类型,函数及其在代码所在行的一些信息。当在编译的时候,我们可以设置IDE switches command-line 选项来调试。举个例子,在Visual C++里面我们可以通过设置/Zi来告诉编译我们是否允许生成PDB。同样地,/Od禁止编译器优化代码。虽然这样做将减慢代码的运行速度,但是这样对于调试是非常有用的。

设置如图(Project Property Pages èC/C++èGeneral propertyèDebug Information Format,将此选项设置为/Zi(Program Database)。请不要设置为Database For Edit & Continue, 否则在编译的时候编译器将加入很多额外的Editing and Continuing信息,而且这些信息是非常巨大并且将减慢运行的速度。

在设置玩编译选项之后,我们将来设置连接选项(linker switches):/INCREMENTAL:NO, /DEBUG, and /PDB.(Project Property PagesèlinkerèGeneral propertyèEnable Incremental Linking)

 (Project Property PagesèLinkerèDebugging Propery)Debug Info option设置为Yes(/DEBUG). 下面我们来设置/PDB选项,(在/PDB选项的上面),将Gennerate Program Database File选项设置为$(OutDir)/$(ProjectName).PDB.

一个incrementally linked program在功能上同nonincrementally linked是相同的。然而,incrementally linked executable(.exe) 或者dynamic-link library(DLL)都要为后来的连接做准备,因此:
1.
一个incrementally linked program将比nonincrementally linked program大,因为它加入了一些额外的代码和数据。
2.
有可能将重新定位function的地址

注意:在最终的release版本中,我们不需要额外的信息,所以在连接的时候使用nonincrementally.

当我们要完全取得符号(symbols)调试信息时,/OPT:REF/OPT:ICF是必须的。(LinkerèOptimization propertyèReferences),将编译器选项设置为Eliminate Unreferenced Data(/OPT:REF).Enable COMDAT Folding设置为Remove Redundant COMDATs(/OPT:ICF). /DEBUG选项作为debug模式下的默认选项,该选项使得编译器连接所有的函数(不管有没有调用)。/OPT:REF选项告诉连接器只连接程序所使用的函数调用。如果你忘记了设置/OPT:REF,程序的release版本将包含你没有调用的函数,使得程序变大。/OPT:ICF在有必要的情况下将合并已经确定的数据COMDAT记录,当你使用常量的时候,所有的引用将指向这个变量(不会出现数据冗余)。

如果我们要将所有的warning看作是error的话,/WX选项就能够满足要求。Visual C++的默认警告级别是warning-level 3(CL.EXE中对应的选项是/W3)。警告的下一个级别是warning-level 4(CL.EXE中对应的选项是/W4),同时我们需要将编译器设置为将所有的warning看作是error/WX)。(Project Property PagesèC/C++èGeneral Property

将编译器的警告级别设置为warning-level 4并且加入/WX的想法会非常不错J。但是事实上,该配置不会想想像中的那样。当我们在编译的时候,我们会感觉到迷惑L。如果我们不能将所有的warning(不管是什么样的)修复的话,就会失去很多隐藏在输出中的信息,而且我们不能够在这种情况下调试程序。所以我们必须很直观的对待warning#pragma warning对于我们更加的适用。

当你在包含一个头文件的时候,如果你不想让编译器将警告级别设置为warning-level 4的话,#pragma warning可以帮助我们降低编译器的警告级别:在包含头文件test.h之前,我们将编译器的警告级别设置为3#pragma warning(push, 3)),当我们完成的时候,重新恢复编译器的编译级别为4(#pragma warning(pop)),所以以后的编译编译器将采用warning-level 4

#pragma warning ( push , 3 )

#include "test.h"

#pragma warning ( pop )

同时,我们也可以用#pragma warning来禁止显示某个警告(#pragma warning(diable:4201))。然后当我们不需要的时候,我们将warning恢复为默认状态(#pragma warning(default:4201))。

// Disable a individual warning

#pragma warning ( disable : 4201 )

......

// Turn warning back on.

#pragma warning ( default : 4201 )

我们经常会遇到一个警告:C4100"'identifier': unreferenced formal parameter"。当遇到这种情况的时候,我们经常不知道该怎么做L。解决的办法是这样的:当你又一个参数(parameter)没有用到的时候,最好的方法是在定义的时候将这个参数去掉。然而,当你在使用面向对象的方法的时候,在不需要改动基类的情况下,你要派生出一个成员函数,而该成员函数没有必要使用这些参数,那我们可以将参数去掉,而只留下参数类型的方法来实现。

// This code will generate the C4100 error.

int ProblemMethod ( int i , int j )

{

    return ( 5 ) ;

}

// The following code properly avoids the C4100 error.

int GoodMethod ( int /* i */ , int /* j */ )

{

    return ( 22 ) ;

}

你可能感兴趣的:(设置编译器选项)