visual c++中预定义的宏
一、主要目标
(由于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(即使已经定义了)。
visual c++中预定义的宏的更多相关文章
- gcc中预定义的宏__GNUC__
转载:gcc中预定义的宏__GNUC__ - Cccarl - 博客园 (cnblogs.com) 今天在看Linux系统编程这本书的代码的时候看到了__GNUC__,不太清楚这个宏所以去查了一下,以 ...
- ARM编译器中预定义的宏
arm系列目前支持三大主流的工具链,realview的armcc,iar ewarm的iccarm,gnu的gcc,编译器在编译的时候会预定义一些宏,这些宏在工程中起到不可或缺的作用. 例如 /* d ...
- C++中预定义的宏
以下信息摘自与标准C++的文档中. 如果把这些宏加在程序的日志中,它将为开发人员进行问题分析提供了很好的帮助. standard c++ 1998版The following macro names ...
- VS2013 预定义的宏
Visual Studio 2013 预定义的宏 https://msdn.microsoft.com/zh-cn/library/b0084kay(v=vs.120).aspx 列出预定义的 ANS ...
- C标准中一些预定义的宏
C标准中指定了一些预定义的宏,对于编程经常会用到.下面这个表中就是一些常常用到的预定义宏. 宏(双下滑线) 意义 __DATE__ 进行预处理的日期(“Mmm dd yyyy”形式的字符串文字) __ ...
- C标准中一些预定义的宏,如__FILE__,__func__等
C标准中一些预定义的宏 C标准中指定了一些预定义的宏,对于编程经常会用到.下面这个表中就是一些常常用到的预定义宏. 宏 意义 __DATE__ 进行预处理的日期(“Mmm dd yyyy”形式的字符串 ...
- 2019-8-31-dotnet-新项目格式与对应框架预定义的宏
title author date CreateTime categories dotnet 新项目格式与对应框架预定义的宏 lindexi 2019-08-31 16:55:58 +0800 201 ...
- dotnet 新项目格式与对应框架预定义的宏
在 sdk style 的项目格式支持使用多框架开发,此时需要在代码里面通过宏判断,在编译的时候执行不同的代码.本文告诉大家在框架里面对应的预定义的条件编译符有哪些 在让一个 csproj 项目指定多 ...
- 五个在XML文档中预定义好的实体
下面是五个在XML文档中预定义好的实体: < < 小于号 > > 大于号 & & 和 ' ' 单引号 " " 双引号 实体 ...
随机推荐
- boost boost::asio::read socket.read_some 区别
boost boost::asio::read 尝试读一定数量的字节,直到读到为止,或者出错 socket.read_some 读一下socket,读到多少算多少 带async的类似
- Android开发环境内容汇总
Android开发环境将分为SDK相关内容.Eclipse ADT相关内容.模拟器AVD相关内容.调试器DDMS相关内容.日志LogCat相关内容.连接驱动ADB相关内容.内存泄露检测工具MAT相关 ...
- 【RS】List-wise learning to rank with matrix factorization for collaborative filtering - 结合列表启发排序和矩阵分解的协同过滤
[论文标题]List-wise learning to rank with matrix factorization for collaborative filtering (RecSys '10 ...
- Ant scp upload文件至linux server(用java调用Ant api)
1.要准备的jar包:ant.jar,ant-jsch.jar code: package com.test.utils; import org.apache.tools.ant.Project; i ...
- C语言连接MySQL数据库(转)
c++连接MySQL有两种方式,1是原始的方法,2是用 Connector c++ .Connector c++ 只是一种封装,使之更加方便. 1.原始方法 这里归纳了C API可使用的函数,并在下 ...
- Intel Galileo驱动单总线设备(DHT11\DHT22)(转)
Intel Galileo一代的IO翻转速度不够,无法直接驱动单总线设备,二代听说改进了,但没有库,于是国外开发者想出了另一种法子,转过来给大家学习下.如果后面有时间,再来翻译.原文地址:http:/ ...
- MySQL导入SQL文件过大或连接超时的解决办法/在navcat执行sql卡在0%
set global max_allowed_packet=100 000 000;set global net_buffer_length=100000;SET GLOBAL interactiv ...
- Nginx 在ubuntu14.04下的安装
来源:http://blog.csdn.net/hanshileiai/article/details/45580001 按照步骤一步一步来,绝对ok 1.如果出现错误: *4 connect() t ...
- 一个“蝇量级” C 语言协程库
协程(coroutine)顾名思义就是“协作的例程”(co-operative routines).跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程 ...
- javascript some()函数用法详解
参数说明callback: 要对每个数组元素执行的回调函数.thisObject : 在执行回调函数时定义的this对象. 功能说明对数组中的每个元素都执行一次指定的函数(callback),直到此函 ...