常规-附加包含目录这个很常用的了.如果自己以前写过一些库,可以重用,那么就把那个库所在的位置放进来。然后在工程里#include就可以了。
但这个库所放的位置最好能规范一些。比如放到工程目录上一级,并命名为src、lib这样的。在附加包含目录里,用相对地址和vs内置的宏来描述。切忌绝对路径、切忌放到不同的本地磁盘上。
常规-调试信息格式
说一下/ZI和/Zi
如果允许的情况下,或者在编译成发布版本前,能用ZI就用ZI。但ZI会阻止编译器的一些优化。
发布版本使用/Zi,编译器会进行一些优化。
/ZI和/Zi有啥区别?
在用Zi时,命中一个断点后:
这时编辑代码,增加一行语句,并继续执行:
新增加的代码并不能直接运行,程序仍然按照旧代码执行。
如果改为/ZI后:
同样增加一行代码,并继续执行:
程序就按照新代码执行了。这有点类似于java的热替换,不过vc又重新编译了一遍代码。
调试程序时,这个功能很好用的。
常规-警告等级
分为五个等级。一般应用层的程序,W3就差不多够了。如果是内核程序,这个就要求比较高了。
常规-将警告视为错误
有警告出现时当做错误处理。使用这个选项来严格要求自己是个好习惯,但我是受不了....内核开发这个是默认打开的。
因为没有使用i的警告,导致编译错误。
另外,如果开启这个选项,比如用strcpy什么的,也会报错,编译器会推荐用strcpy_s这类的安全函数。
优化-优化
这个选项是和调试信息格式选项有关的。/ZI和优化冲突。
不同的优化规则会导致编译出来的文件大小有变化。
貌似release和debug编译出来文件大小的主要区别就是在这里。
优化-内联函数展开
如果启用优化时,会把内联函数展开。包括自己定义的内联、头文件中声明的函数、和编译器认为可以作为内联的。
不过不是我们定义一个inline函数,编译器就一定当成inline处理的。内联函数里不能有循环、不能超过20行(不知道这个数字记错没)。
预处理器-预处理器定义
在这里定义一些和系统相关的宏。在调用编译器进行编译之前执行。
http://www.cnblogs.com/whiteyun/archive/2011/07/07/2099918.html
这里有详细的预处理指令。
语言-OpenMP支持
多核编程支持。打开OMP支持后,一个简单的程序:
将for循环拆分成了多个任务。
适当的使用多核编程可以提高程序执行效率,但一定要注意数据保护和同步。
代码生成-基本运行时检查
检查堆栈和未初始化的变量。常规程序当然推荐全开,但有些比较特殊的程序,比如栈溢出测试,就要关掉堆栈检查了。
代码生成-运行库
在第一篇文章里介绍常规-MFC的使用时,提到过这个。
MD是使用动态库、MT是使用静态库。是VC API和CRT的库,不是MFC。
如果使用MD编译的程序,在另一个系统里不能运行。使用Depends查看发现有函数未知。那么就是动态编译的问题了。改成MT或者能成功。
选项后面带d的是debug版本,不带d的是release版本。debug版本会链接有调试信息的库。
预编译头
大工程里,使用预编译头会加快编译。多线程编译是很爽很快的。
高级-调用约定
网上关于_cdecl/_stdcall/_fastcall/_thiscall这些的解释很多,就不说了。这个就是控制默认函数声明时,采用何种调用约定生成的。
调用约定主要是对于函数名称、堆栈平衡维护位置、使用寄存器优化等起作用的。
写dll时比较在乎这个,不过一般都是放到模块定义文件里的。
高级-编译为
使用c编译器还是c++编译器。如果工程源文件是.c会自动使用c编译器,.cpp会使用c++编译器。
另外,再百度查查extern C吧。
c++编译器编译函数时,除了遵循调用约定外,还会在函数后面加些编码。
命令行
就是所有在使用的编译选项。