VS中添加预处理宏的方法

除了在.c及.h中添加宏定义之外,还可以采用如下方法添加宏定义:

1、若只需要定义一个宏(如#define DEBUG),可以右键点击工程-->属性-->c/c++-->预处理器-->预处理器定义,点击下拉框中的编辑,输入想要定义的宏;

2、如果还需要定义宏的内容(如#define inline __inline),可以右键点击工程-->属性-->c/c++-->命令行,在其它选项中输入如下内容: /D"inline"=__inline 。

Visual Studio 2013 预定义的宏

列出预定义的 ANSI/ISO C99 和 Microsoft C++ 实现预处理宏。

编译器识别预定义的 ANSI/ISO C99 C 预处理宏,Microsoft C++ 实现将提供更多宏。 这些预处理器宏不带参数,并且不能重新定义。 本文中所列的一些预定义宏用多个值进行定义。

ANSI 兼容的预定义宏

说明

__DATE__

当前源文件的编译日期。 该日期是 Mmm dd yyyy 形式的字符串文本。 月份名称 Mmm 与 TIME.H 中声明的 asctime 库函数生成的日期相同。

__FILE__

当前源文件的名称。 __FILE__ 扩展到字符串文本。 若要确保显示文件的完整路径,请使用 /FC(所诊断源代码文件的完整路径)

__func__

以 char 数组形式返回封闭函数的未限定和未修饰名称。

 
 
void Foo(){
printf("%s\n", __func__);
} // prints “Foo”

__LINE__

当前源文件中的行号。 行号是一个十进制整数文本。 它可以随 #line 指令改变。

__STDC__

指示符合 ANSI/ISO C99 标准。 只有提供了 /Za 编译器选项但未编译 C++ 代码时才定义为整数型常数 1;否则是不确定的。

__TIME__

当前源文件的最新编译时间。 该时间是 hh:mm:ss 形式的字符串文本。

__TIMESTAMP__

当前源文件的最近一次的修改日期和时间,表示为以 Ddd Mmm Date hh:mm:ss yyyy 的形式编写的字符串文本,Ddd 为星期的缩写,而 Date 为从 1 到 31 的整数。

Microsoft 专用预定义宏

说明

_ATL_VER

定义 ATL 版本,编码为整数文本。

__AVX__

指定了 /arch:AVX 或 /arch:AVX2 时进行定义。

__AVX2__

指定了 /arch:AVX2 时进行定义。

_CHAR_UNSIGNED

默认 char 类型为 unsigned。 指定了 /J 时进行定义。

__CLR_VER

编译应用程序时,定义使用的公共语言运行时的版本。 返回值是采用以下格式编码的整数文本:

Mmmbbbbb

其中,

  • M 为运行时的主版本

  • mm 为运行时的次版本

  • bbbbb 为生成号。

 
 
// clr_ver.cpp
// compile with: /clr
using namespace System;
int main() {
Console::WriteLine(__CLR_VER);
}

__cplusplus_cli

当使用 /clr/clr:pure 或 /clr:safe 编译时定义。 __cplusplus_cli 的值是整数文本 200406。 __cplusplus_cli 的效力范围是整个翻译单元。

 
 
// cplusplus_cli.cpp
// compile with: /clr
#include "stdio.h"
int main() {
#ifdef __cplusplus_cli
printf("%d\n", __cplusplus_cli);
#else
printf("not defined\n");
#endif
}

__cplusplus_winrt

当使用 /ZW 选项来编译时定义。 __cplusplus_winrt 的值是整数文本 201009。

__COUNTER__

扩展成一个以 0 开始的整数文本,该整数每次用于源文件或源文件包含的标头时增加 1。 当你使用预编译标头时,__COUNTER__会记住其状态。

下面的示例使用 __COUNTER__,将唯一标识符分配到同一类型的三个不同的对象。

首先,假设以下类定义。 构造函数将一个整数作为参数。

 
// initialize object with a read-only unique ID
exampleClass::exampleClass(int nID)
{
m_nID = nID;
} int exampleClass::GetID()
{
return m_nID;
}

在主窗格中,应用程序声明类型为 exampleClass 的三个对象,并将 __COUNTER__ 用作唯一标识符参数。

 
// Demonstration of __COUNTER__, assigns unique identifiers to 
// different objects of the same type 
int main(int argc, char** argv)
{
// __COUNTER__ is initially defined as 0
exampleClass e1(__COUNTER__); // having been referenced, __COUNTER__ is now defined as 1
exampleClass e2(__COUNTER__); // __COUNTER__ is now defined as 2
exampleClass e3(__COUNTER__); printf("e1 ID: %i\n", e1.GetID());
printf("e2 ID: %i\n", e2.GetID());
printf("e3 ID: %i\n", e3.GetID()); // Output 
// ------------------------------ 
// e1 ID: 0 
// e2 ID: 1 
// e3 ID: 2  return 0;
}

__cplusplus

仅定义 C++ 程序。

_CPPRTTI

定义使用 /GR(启用运行时间类型信息)编译的代码。

_CPPUNWIND

定义通过使用其中一个 /EH(异常处理模型) 标志编译的代码。

_DEBUG

当使用 /LDd/MDd 和 /MTd 编译时定义。

_DLL

在指定 /MD 或 /MDd(多线程 DLL)时定义。

__FUNCDNAME__

仅在函数中有效。 将封闭函数的修饰名定义为字符串文本。

如果你使用的是 __FUNCDNAME__/EP 或 /P 编译器选项,不展开。

下面的示例使用 __FUNCDNAME__、__FUNCSIG__ 和 __FUNCTION__ 宏来显示函数信息。

 
// Demonstrates functionality of __FUNCTION__, __FUNCDNAME__, and __FUNCSIG__ macros 
void exampleFunction()
{
printf("Function name: %s\n", __FUNCTION__);
printf("Decorated function name: %s\n", __FUNCDNAME__);
printf("Function signature: %s\n", __FUNCSIG__); // Sample Output 
// ------------------------------------------------- 
// Function name: exampleFunction 
// Decorated function name: ?exampleFunction@@YAXXZ 
// Function signature: void __cdecl exampleFunction(void)
}

__FUNCSIG__

仅在函数中有效。 将封闭函数的签名定义为字符串文本。

如果你使用的是 __FUNCSIG__/EP 或 /P 编译器选项,不展开。

在 64 位操作系统上,调用约定默认为 __cdecl。

有关示例,请参见 __FUNCDNAME__。

__FUNCTION__

仅在函数中有效。 将封闭函数的未修饰名定义为字符串。

如果你使用的是 __FUNCTION__/EP 或 /P 编译器选项,不展开。

有关示例,请参见 __FUNCDNAME__。

_INTEGRAL_MAX_BITS

报告整型作为整形文本的最大大小(以位为单位)。

 
 
// integral_max_bits.cpp
#include <stdio.h>
int main() {
printf("%d\n", _INTEGRAL_MAX_BITS);
}

_M_AMD64

为面向 x64 处理器的编译进行定义。

_M_ARM

为面向 ARM 处理器的编译进行定义。

_M_CEE

定义使用任何形式的 /clr(例如 /clr:oldSyntax/clr:safe)的编译。

_M_CEE_PURE

定义使用 /clr:pure 的编译。

_M_CEE_SAFE

定义使用 /clr:safe 的编译。

_M_IX86

为面向 x86 处理器的编译进行定义。 这不是为 x64 处理器定义的。

_M_ARM_FP

扩展为指示使用哪个 /arch 编译器选项的整数型值:

  • 在 30-39 的范围内,如果未指定 /arch ARM 选项,则表明使用的是 ARM 的默认体系结构(VFPv3)。

  • 如果使用 /arch:VFPv4,则在 40-49 的范围内。

  • 有关更多信息,请参见/arch (x86)

_M_IX86_FP

扩展为指示使用哪个 /arch 编译器选项的整数型值:

  • 0(如果使用了 /arch:IA32)。

  • 1(如果使用了 /arch:SSE)。

  • 2(如果使用了 /arch:SSE2/arch:AVX 或 /arch:AVX2)。 如果未指定 /arch 值,则该值为默认值。 当指定 /arch:AVX时,也定义了宏 __AVX__。 当指定 /arch:AVX2 时,还将定义 __AVX__ 和 __AVX2__

  • 有关更多信息,请参见/arch (x86)

_M_X64

为面向 x64 处理器的编译进行定义。

_MANAGED

当指定 /clr 时,定义为 1。

_MFC_VER

定义 MFC 版本,编码为整数文字。

_MSC_BUILD

计算结果为整数文字,其中包含编译器的版本号的修订号组合。 修订号为用句点分隔的版本号的第四个部分。 例如,如果 Visual C++ 编译器的版本号为 15.00.20706.01,则 _MSC_BUILD 宏计算结果为 1。

_MSC_EXTENSIONS

在使用 /Ze 编译器选项(默认值)进行编译时,就定义了该宏。 定义时,值为 1。

_MSC_FULL_VER

计算结果为整数文字,其编码编译器的主版本号、次版本号和生成版本号的组合。 主版本号时句点分隔的版本号的第一个部分,次版本号是第二个部分,而生成号是第三个部分。 例如,如果 Visual C++ 编译器的版本号为 15.00.20706.01,则 _MSC_FULL_VER宏计算结果为 150020706。 在命令行中键入 cl /?,查看编译器的版本号。

_MSC_VER

计算结果为整数文字,其编码编译器的版本号的修订号组合。 主版本号是句点分隔的版本号的第一个部分,而次版本号是第二个部分。

例如,如果 Visual C++ 编译器的版本号为 17.00.51106.1,则 _MSC_VER 宏计算结果为 1700。 在命令行中键入 cl /?,查看编译器的版本号。

__MSVC_RUNTIME_CHECKS

当指定其中一个 /RTC 编译器选项时定义。

_MT

当指定 /MD 或 /MDd(多线程 DLL)或 /MT 或 /MTd(多线程)时定义。

_NATIVE_WCHAR_T_DEFINED

当使用 /Zc:wchar_t 时定义。

_OPENMP

当使用 /openmp 进行编译时定义,求值得出表示由 Visual C++ 实现的 OpenMP 规范日期的整数文本。

 
 
// _OPENMP_dir.cpp
// compile with: /openmp
#include <stdio.h>
int main() {
printf("%d\n", _OPENMP);
}

_VC_NODEFAULTLIB

当使用 /Zl 时定义;有关详细信息,请参阅 /Zl(省略默认库名)

_WCHAR_T_DEFINED

当项目中包含的系统标头文件使用 /Zc:wchar_t 或者定义 wchar_t 时定义。

_WIN32

定义 Win32 和 Win64 的应用程序。 始终定义。

_WIN64

定义为Win64应用程序。

VS中添加预处理宏的方法的更多相关文章

  1. 在html中添加script脚本的方法和注意事项

    在html中添加script脚本有两种方法,直接将javascript代码添加到html中与添加外部js文件,这两种方法都比较常用,大家可以根据自己需要自由选择 在html中添加<script& ...

  2. 如何在Eclipse中添加Servlet-api.jar的方法

    方法一: 点击窗口->首选项->java->构建路径->类路径变量->新建:将你的tomcat目录下的common/lib/servlet.jar加进来.如果你建立了一个 ...

  3. Android开发过程中在sh,py,mk文件中添加log信息的方法

    Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...

  4. 详解VMware 虚拟机中添加新硬盘的方法

    一.VMware新增磁盘的设置步骤 (建议:在设置虚拟的时候,不要运行虚拟机的系统,不然添加了新的虚拟磁盘则要重启虚拟机) 1.选择“VM”----“设置”并打开,将光标定位在“硬盘(SCSI)”这一 ...

  5. 【前端】向blog或网站中添加语法高亮显示代码方法总结

    向blog或网站中添加语法高亮显示的代码方法总结 文章目录 预备知识 目标 第一类方法:嵌入 第二类方法:外部引用 第三类方法:忽略HTML和PHP 最近在写代码时遇到一个问题,就是如何让代码像在ID ...

  6. VMware 虚拟机中添加新硬盘的方法(转载)

    随着在虚拟机中存储的东西的逐渐的增加,虚拟机的硬盘也逐渐告急,因此急需拓展一块新的虚拟磁盘.以下便是在VMware 中添加新的虚拟磁盘的方法:   一.VMware新增磁盘的设置步骤 (建议:在设置虚 ...

  7. Androidstudio中添加jar包的方法

    在Androidstudio中添加一个jar包进去,怎么添加? 以下纯个人使用Androidstudio过程中的经验积累,要是有不足,望提出建议. 方法一: 先点击Androidstudio中的Pro ...

  8. VS2010在C#头文件中添加文件注释的方法

    步骤: 1.VS2010 中找到安装盘符(本人安装目录在D盘,所以以D盘为例)D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\I ...

  9. excel表格中添加单引号的方法

    今天碰到需要插入大量数据的excel表格,其中有很多文本,需要添加单引号. 方法如下: 左边是原始数据,右边是我即将添加单引号的空白区域. 第一步:在需要添加的位置输入= 第二步:输入等号之后点击需要 ...

随机推荐

  1. Open Closed Principle(OCP)开闭原则

    面向对象的最基本原则 Software entites like classes,modules and functions should be open for extension but cloa ...

  2. (转)10 分钟内快速构建能够承载海量数据的 nginx 日志分析与报警平台

    10 分钟内快速构建能够承载海量数据的 nginx 日志分析与报警平台 原文:https://blog.qiniu.com/archives/8713

  3. select简单示例,有注释

    全部都在代码中: import select import socket import queue """ 简单的select 实现echo server 个人理解: s ...

  4. 【shell】《shell学习指南》读书笔记

    一.使用shell脚本 优点:脚本语言能够轻易处理文件与目录之间的对象,如把文件从所有目录拷贝到另一个目录 缺点:效率不如编译型语言 二.简单的脚本 1.查看现在系统有谁登录 $who 2.算出行数 ...

  5. 关于两个 IQueryable 合并

    原先根据需求要对数据进行两种筛选,起初写过滤条件,但是过滤后发现有的数据重叠.因此改为查询两次. 因为查询后返回的是两个相同的.匿名的 IQueryable ,最终的目的是想两个 类型结合成一个. 参 ...

  6. Python pip windows安装

    参考页面: [1] : https://pip.pypa.io/en/latest/installing.html [2] : http://stackoverflow.com/questions/4 ...

  7. [原创]vs2012创建的ado.net模型无法实例化的问题

    最近从vs2010升级到vs2012,建立数据模型,发现生成的东西跟以前不一样了,而且也无法实例化使用.百度尝试了n种关键词,终于被我找到解决的方法.在这里记录一下. 1.打开设计器,也就是双击这个 ...

  8. ArcGisJS实现地图常用工具条、距离测量和面积测量(非官方实例)

    常用地图工具包括:平移.拉框缩小.拉框放大.全图.距离测量.面积测量.清除标记,距离测量.面积测量没有使用官方自带的组件代码. 1.距离测量 2.面积测量 3.源代码 <!DOCTYPE htm ...

  9. linux漏洞分析入门笔记-栈溢出

    ida7.0 ubuntu16.04 lts 0x00:环境配置 使用IDA远程调试Linux程序步骤如下: 1. 在进行远程调试之前需要对Linux平台进行一些准备工作.在IDA的安装目录中的dbg ...

  10. Android 从 Web 唤起 APP

    前言 知乎在手机浏览器打开,会有个 App 内打开的按钮,点击直接打开且跳转到该详情页,是不是有点神奇,是如何做到的呢? 效果预览 Uri Scheme 配置 intent-filter Androi ...