VS2013 預定義的宏


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__,將唯一標識符分配到同一類型的三個不同的對象。

首先,假設以下類定義。 構造函數將一個整數作為參數。

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

int exampleClass::GetID()
{
	return m_nID;
}

在主窗格中,應用程序聲明類型為 exampleClass 的三個對象,並將 __COUNTER__ 用作唯一標識符參數。

C++
 
// 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__ 宏來顯示函數信息。

C++
 
// 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應用程序。

 

http://www.cnblogs.com/oloroso/p/5506097.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM