一、主要目标
(由于visual studio通常包含很多开发环境,通常将其中c/c++的ide称为visual c++ 20xx)
整理下visual c++ 2010下预定义的宏。做一下备忘和了解,在实际编码中可以考虑使用部分宏作为判断标准。
主要参考链接:http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.100).aspx
二、vc++ 2010中预定义宏
注意本文中提及的所有预定义宏都是无参数的,并且不能重定义。
1. __FILE__、__LINE__
这两个预定义宏是c语言中定义的,主要用于标识代码段所在的源文件名称(全路径或者文件名)以及当前位置在源文件中的行数。多用于错误跟踪、预编译报错、程序异常跟踪等,比如TRACE、ASSERT失败的提示信息。
2. _CHAR_UNSIGNED
vc中附加定义的宏。主要用于说明char类型的数据,是有符号的还是无符号的。默认情况下char是无符号的。
在很多开源项目里面,使用cl或gcc编译源码时可能需要关注下char的正负:因为有符号的char在做数值运行遇到类型提升的情况可能会存在不确定性的行为(跟编译器的实现有关)。
3. __FUNCDNAME__、__FUNCSIG__、__FUNCTION__
vc中定义的宏。仅在函数实现中使用有效。三个宏分别表示:编译器修饰后的函数名称、函数签名、代码中的函数名称。
实际使用可参考下列代码:
void exampleFunction()
{
printf("Function name: %s\n", __FUNCTION__);
printf("Decorated function name: %s\n", __FUNCDNAME__);
printf("Function signature: %s\n", __FUNCSIG__); // vc++ 2010的实际输出
// -------------------------------------------------
// Function name: exampleFunction
// Decorated function name: ?exampleFunction@@YAXXZ
// Function signature: void __cdecl exampleFunction(void)
}
4. _WIN32、_WIN64
vc中定义的宏。用于说明应用程序是基于win32或是win64平台的。
5. _DEBUG
vc中定义的宏。含义很明显,用于标识当前程序是调试版本。
之所以单独拿出来是因为 _DEBUG和DEBUG两个宏经常混在一起,很容易让人误解到底该使用哪一个。
按照msdn上介绍和说明,几乎多数资料都只有_DEBUG宏,这也是assert、TRACE等生效必须定义的宏。
那么DEBUG这个宏是从哪里来的呢? MFC程序里面通常会用DEBUG宏定义。你可以随便找个mfc项目中的源代码文件,输入#ifdef DEBUG,然后转到定义看看其实现。在atldef.h中,会看到如下定义:
#ifdef _DEBUG
#ifndef DEBUG
#define DEBUG
#endif
#endif
这样就是比较显然了。是mfc中预定义的宏,个人感觉像是防止用户误使用。
因此,在实际编码中应该使用_DEBUG宏,不要使用DEBUG(即使已经定义了)。