编译器内建宏

 

介绍msvc和gcc4的内建宏(predefined macros)。

MSVC

详细的VS2012编译器内建宏可参考该页面

编译器版本

_MSC_VER         MSVC编译器版本
_MSC_VER = 1600  MS VC++ 10.0  
_MSC_VER = 1500  MS VC++ 9.0   
_MSC_VER = 1400  MS VC++ 8.0   
_MSC_VER = 1310  MS VC++ 7.1   
_MSC_VER = 1300  MS VC++ 7.0   
_MSC_VER = 1200  MS VC++ 6.0   
_MSC_VER = 1100  MS VC++ 5.0

系统架构

_WIN32           32位编译器
_WIN64           64位编译器

调试版本

_DEBUG           Debug版本
NDEBUG           Release版本

其他宏

__cplusplus      C++编译

GCC4

查看gcc4内建宏的方法,gcc -dM -E - < /dev/null,详细的宏介绍可参考该页面

gcc版本

__GNUC__         gcc主版本号
__GNUC_MINOR__   gcc次版本号

系统架构

_LP64(__LP64__)  LP64数据模型,用于64位系统

阅读资料

---------------------------------------------------------------------------

 

Predefined Macros

Visual Studio 2015
 
 

Lists the predefined ANSI/ISO C99 and Microsoft C++ implementation preprocessor macros.

The compiler recognizes predefined ANSI/ISO C99 C preprocessor macros, and the Microsoft C++ implementation provides several more. These preprocessor macros take no arguments and cannot be redefined. Some of the predefined macros listed in this article are defined with multiple values.

ANSI-Compliant Predefined Macros

Macro

Description

__DATE__

The compilation date of the current source file. The date is a string literal of the form Mmm dd yyyy. The month name Mmm is the same as for dates generated by the library function asctime declared in TIME.H.

__FILE__

The name of the current source file. __FILE__ expands to a string literal. To ensure that the full path to the file is displayed, use /FC (Full Path of Source Code File in Diagnostics).

__func__

Returns the unqualified and unadorned name of the enclosing function as an array of char.

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

__LINE__

The line number in the current source file. The line number is a decimal integer literal. It can be changed with a #line directive.

__STDC__

Indicates conformance with the ANSI/ISO C99 standard. Defined as the integer literal constant 1 only if the /Za compiler option is given and you are not compiling C++ code; otherwise is undefined.

__TIME__

The most recent compilation time of the current source file. The time is a string literal of the form hh:mm:ss.

__TIMESTAMP__

The date and time of the last modification of the current source file, expressed as a string literal in the form Ddd Mmm Date hh:mm:ss yyyy, where Ddd is the abbreviated day of the week and Date is an integer from 1 to 31.

Microsoft-Specific Predefined Macros

Macro

Description

_ATL_VER

Defines the ATL version, encoded as an integer literal.

 

__AVX__

Defined when /arch:AVX or /arch:AVX2 is specified.

__AVX2__

Defined when /arch:AVX2 is specified.

_CHAR_UNSIGNED

Default char type is unsigned. Defined when /J is specified.

__CLR_VER

Defines the version of the common language runtime used when the application was compiled. The value returned is an integer literal encoded in the following format:

Mmmbbbbb

where,

  • M is the major version of the runtime

  • mm is the minor version of the runtime

  • bbbbb is the build number.

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

__cplusplus_cli

Defined when you compile with /clr/clr:pure, or /clr:safe. Value of __cplusplus_cli is the integer literal 200406. __cplusplus_cli is in effect throughout the translation unit.

 
 
// 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

Defined when you use the /ZW option to compile. The value of __cplusplus_winrt is the integer literal 201009.

__COUNTER__

Expands to an integer literal starting with 0 and incrementing by 1 every time it is used in a source file or included headers of the source file. __COUNTER__ remembers its state when you use precompiled headers.

The following example uses __COUNTER__ to assign unique identifiers to three different objects of the same type.

First, assume the following class definition. The constructor takes an integer as a parameter.

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

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

In main, the application declares three objects of type exampleClass, using __COUNTER__ as the unique identifier parameter.

 
// 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

Defined for C++ programs only.

_CPPRTTI

Defined for code compiled with /GR (Enable Run-Time Type Information).

_CPPUNWIND

Defined for code compiled by using one of the /EH (Exception Handling Model) flags.

_DEBUG

Defined when you compile with /LDd/MDd, and /MTd.

_DLL

Defined when /MD or /MDd (Multithreaded DLL) is specified.

__FUNCDNAME__

Valid only in a function. Defines the decorated name of the enclosing function as a string literal.

__FUNCDNAME__ is not expanded if you use the /EP or /P compiler option.

The following example uses the __FUNCDNAME____FUNCSIG__, and __FUNCTION__ macros to display function information.

 
// 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__

Valid only in a function. Defines the signature of the enclosing function as a string literal.

__FUNCSIG__ is not expanded if you use the /EP or /P compiler option.

On a 64-bit operating system, the calling convention is __cdecl by default.

See __FUNCDNAME__ for an example.

__FUNCTION__

Valid only in a function. Defines the undecorated name of the enclosing function as a string literal.

__FUNCTION__ is not expanded if you use the /EP or /P compiler option.

See __FUNCDNAME__ for an example.

_INTEGRAL_MAX_BITS

Reports the maximum size (in bits) for an integral type as an integer literal.

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

_M_AMD64

Defined for compilations that target x64 processors.

_M_ARM

Defined for compilations that target ARM processors.

_M_CEE

Defined for a compilation that uses any form of /clr (/clr:oldSyntax/clr:safe, for example).

_M_CEE_PURE

Defined for a compilation that uses /clr:pure.

_M_CEE_SAFE

Defined for a compilation that uses /clr:safe.

_M_IX86

Defined for compilations that target x86 processors. This is not defined for x64 processors.

_M_ARM_FP

Expands to an integer literal value indicating which /arch compiler option was used:

  • In the range 30-39 if no /arch ARM option was specified, indicating the default architecture for ARM was used (VFPv3).

  • In the range 40-49 if /arch:VFPv4 was used.

  • See /arch (x86) for more information.

_M_IX86_FP

Expands to an integer literal value indicating which /arch compiler option was used:

  • 0 if /arch:IA32 was used.

  • 1 if /arch:SSE was used.

  • 2 if /arch:SSE2/arch:AVX or /arch:AVX2 was used. This value is the default if /arch was not specified. When /arch:AVXis specified, the macro __AVX__ is also defined. When /arch:AVX2 is specified, __AVX__ and __AVX2__ are also defined.

  • See /arch (x86) for more information.

_M_X64

Defined for compilations that target x64 processors.

_MANAGED

Defined to be 1 when /clr is specified.

_MFC_VER

Defines the MFC version, encoded as an integer literal.

_MSC_BUILD

Evaluates to an integer literal that contains the revision number component of the compiler's version number. The revision number is the fourth component of the period-delimited version number. For example, if the version number of the Visual C++ compiler is 15.00.20706.01, the _MSC_BUILD macro evaluates to 1.

_MSC_EXTENSIONS

This macro is defined when you compile with the /Ze compiler option (the default). Its value, when defined, is 1.

_MSC_FULL_VER

Evaluates to an integer literal that encodes the major, minor, and build number components of the compiler's version number. The major number is the first component of the period-delimited version number, the minor number is the second component, and the build number is the third component. For example, if the version number of the Visual C++ compiler is 15.00.20706.01, the _MSC_FULL_VER macro evaluates to 150020706. Type cl /? at the command line to view the compiler's version number.

_MSC_VER

Evaluates to an integer literal that encodes the major and minor number components of the compiler's version number. The major number is the first component of the period-delimited version number and the minor number is the second component.

For example, if the version number of the Visual C++ compiler is 17.00.51106.1, the _MSC_VER macro evaluates to 1700. Type cl /? at the command line to view the compiler's version number.

__MSVC_RUNTIME_CHECKS

Defined when one of the /RTC compiler options is specified.

_MT

Defined when /MD or /MDd (Multithreaded DLL) or /MT or /MTd (Multithreaded) is specified.

_NATIVE_WCHAR_T_DEFINED

Defined when /Zc:wchar_t is used.

_OPENMP

Defined when compiling with /openmp, evaluates to an integer literal representing the date of the OpenMP specification implemented by Visual C++.

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

_VC_NODEFAULTLIB

Defined when /Zl is used; see /Zl (Omit Default Library Name) for more information.

_WCHAR_T_DEFINED

Defined when /Zc:wchar_t is used or if wchar_t is defined in a system header file included in your project.

_WIN32

Defined for applications for Win32 and Win64. Always defined.

_WIN64

Defined for applications for Win64.

posted @ 2016-06-26 15:55  zengkefu  阅读(831)  评论(0编辑  收藏  举报