VS - 显示预定义宏的函数

本文介绍了如何在VisualStudio中使用预定义宏,并提供了一个函数示例,展示了如何检查和打印编译器预定义的各种环境变量,如编译器版本、时间戳等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VS - 显示预定义宏的函数

概述

MS官方有文档(https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-170&viewFallbackFrom=vs-2019),指出了VS中的预定义宏。

https://learn.microsoft.com/zh-cn/cpp/preprocessor/predefined-macros?view=msvc-170&devlangs=cpp&f1url=%3FappId%3DDev16IDEF1%26l%3DZH-CN%26k%3Dk(DATE)%3Bk(DevLang-C%252B%252B)%3Bk(TargetOS-Windows)%26rd%3Dtrue

看起来有点用,封装了一个函数,用来检查这些预定义宏的值。在console, win32 desktop app, mfc app中都实验了,好使。

笔记

运行效果

==================== vs predefined macros BEGIN ====================
__func__ = show_vs_predefined_macros
__cplusplus = 199711
__DATE__ = Apr  4 2024
__FILE__ = D:\my_dev\my_local_git_prj\soft\exp\exp001Vs2019Macro\exp001Vs2019Macro\myTrace.cpp
__LINE__  = 102
__STDC_HOSTED__ = 1
__STDCPP_DEFAULT_NEW_ALIGNMENT__ = 16
__STDCPP_THREADS__ = 1
__TIME__ = 16:56:07
__COUNTER__ = 0
_CPPRTTI = 1
_CPPUNWIND = 1
_DEBUG = 1
_DLL = 1
__FUNCDNAME__ = ?show_vs_predefined_macros@@YAXXZ
__FUNCSIG__ = void __cdecl show_vs_predefined_macros(void)
__FUNCTION__ = show_vs_predefined_macros
_INTEGRAL_MAX_BITS = 64
_M_AMD64 = 100
_M_FP_PRECISE = 1
_M_X64 = 100
_MSC_BUILD = 0
_MSC_EXTENSIONS = 1
_MSC_FULL_VER = 192930154
_MSC_VER = 1929
_MSVC_LANG = 201402
__MSVC_RUNTIME_CHECKS = 1
_MSVC_TRADITIONAL = 1
_MT = 1
_NATIVE_WCHAR_T_DEFINED = 1
__TIMESTAMP__ = Thu Apr  4 16:39:22 2024
_WCHAR_T_DEFINED = 1
_WIN32 = 1
_WIN64 = 1
==================== vs predefined macros END ====================

调用方代码

//! \file exp001Vs2019Macro.cpp
//! \ref https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-170&viewFallbackFrom=vs-2019

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "myTrace.h"

int main()
{
    // code env = vs2019 console c++ debug x86
    show_vs_predefined_macros();

    return EXIT_SUCCESS;
}

实现 - .h

//! \file myTrace.h

#ifndef __MY_TRACE_H__
#define __MY_TRACE_H__

// 有些宏是char*, 所以MY_TRACE的入参只能是char*
void MY_TRACE(const char* pszMsg);

// 打印VS的预定义宏
void show_vs_predefined_macros(); 

#endif // #ifndef __MY_TRACE_H__

实现 - .cpp

//! \file myTrace.cpp

// #ifndef _MFC_VER // fatal error C1020: 意外的 #endif
// 用宏包含 pch.h编译不过, 有报错
// #include "pch.h" // 如果不是MFC程序, 注释掉这句
// #endif



#include "myTrace.h"

#ifdef _CONSOLE
// vs console c++

//_DEBUG
//_CONSOLE
//_CRT_SECURE_NO_WARNINGS

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <windows.h> // for OutputDebugStringA

#elif defined(_MFC_VER)
// mfc app

//WIN32
//_WINDOWS
//_DEBUG

#elif defined(_WINDOWS)
// win32 desktop app

//WIN32
//_DEBUG
//_WINDOWS
// _CRT_SECURE_NO_WARNINGS

#include <stdlib.h>
#include <stdio.h>

#include <windows.h> // for OutputDebugStringA



#endif // _CONSOLE

void MY_TRACE(const char* pszMsg)
{
	do {
		if (NULL == pszMsg)
		{
			break;
		}

#ifdef _CONSOLE
		// vs console c++
		OutputDebugStringA(pszMsg);
		printf("%s", pszMsg);
#elif defined(_MFC_VER)
		// mfc app
		OutputDebugStringA(pszMsg);
#elif defined(_WINDOWS)
		// win32 desktop app
		OutputDebugStringA(pszMsg);
#endif
	} while (false);

}

void show_vs_predefined_macros()
{
	char szBuf[4096];
	// const char* pszText = NULL;

	sprintf(szBuf, "==================== vs predefined macros BEGIN ====================\n");
	MY_TRACE(szBuf);

	// pszText = &__func__[0];
	// sprintf(szBuf, "__func__ = %s\n", pszText); // __func__始终是有的, 不能用#ifdef来判断
	sprintf(szBuf, "__func__ = %s\n", __func__);
	// 因为这些参数都是宏, 需要先拼完再打印, 否则乱码
	MY_TRACE(szBuf);

#ifdef __cplusplus
	sprintf(szBuf, "__cplusplus = %d\n", __cplusplus);
	MY_TRACE(szBuf);
#endif

#ifdef __DATE__
	sprintf(szBuf, "__DATE__ = %s\n", __DATE__);
	MY_TRACE(szBuf);
#endif

#ifdef __FILE__
	sprintf(szBuf, "__FILE__ = %s\n", __FILE__);
	MY_TRACE(szBuf);
#endif

#ifdef __LINE__
	sprintf(szBuf, "__LINE__  = %d\n", __LINE__);
	MY_TRACE(szBuf);
#endif

#ifdef __STDC__
	sprintf(szBuf, "__STDC__ = %d\n", __STDC__);
	MY_TRACE(szBuf);
#endif

#ifdef __STDC_HOSTED__
	sprintf(szBuf, "__STDC_HOSTED__ = %d\n", __STDC_HOSTED__);
	MY_TRACE(szBuf);
#endif 

#ifdef __STDC_NO_ATOMICS__
	sprintf(szBuf, "__STDC_NO_ATOMICS__ = %d\n", __STDC_NO_ATOMICS__);
	MY_TRACE(szBuf);
#endif

#ifdef __STDC_NO_COMPLEX__
	sprintf(szBuf, "__STDC_NO_COMPLEX__ = %d\n", __STDC_NO_COMPLEX__);
	MY_TRACE(szBuf);
#endif

#ifdef __STDC_NO_THREADS__
	sprintf(szBuf, "__STDC_NO_THREADS__ = %d\n", __STDC_NO_THREADS__);
	MY_TRACE(szBuf);
#endif

#ifdef __STDC_NO_VLA__
	sprintf(szBuf, "__STDC_NO_VLA__ = %d\n", __STDC_NO_VLA__);
	MY_TRACE(szBuf);
#endif

#ifdef __STDC_VERSION__
	sprintf(szBuf, "__STDC_VERSION__ = %s\n", __STDC_VERSION__);
	MY_TRACE(szBuf);
#endif

#ifdef __STDCPP_DEFAULT_NEW_ALIGNMENT__
	sprintf(szBuf, "__STDCPP_DEFAULT_NEW_ALIGNMENT__ = %d\n", (int)__STDCPP_DEFAULT_NEW_ALIGNMENT__);
	MY_TRACE(szBuf);
#endif

#ifdef __STDCPP_THREADS__
	sprintf(szBuf, "__STDCPP_THREADS__ = %d\n", __STDCPP_THREADS__);
	MY_TRACE(szBuf);
#endif

#ifdef __TIME__
	sprintf(szBuf, "__TIME__ = %s\n", __TIME__);
	MY_TRACE(szBuf);
#endif

#ifdef __ATOM__
	sprintf(szBuf, "__ATOM__ = %d\n", __ATOM__);
	MY_TRACE(szBuf);
#endif

#ifdef __AVX__
	sprintf(szBuf, "__AVX__ = %d\n", __AVX__);
	MY_TRACE(szBuf);
#endif

#ifdef __AVX2__
	sprintf(szBuf, "__AVX2__ = %d\n", __AVX2__);
	MY_TRACE(szBuf);
#endif

#ifdef __AVX512BW__
	sprintf(szBuf, "__AVX512BW__ = %d\n", __AVX512BW__);
	MY_TRACE(szBuf);
#endif

#ifdef __AVX512CD__
	sprintf(szBuf, "__AVX512CD__ = %d\n", __AVX512CD__);
	MY_TRACE(szBuf);
#endif

#ifdef __AVX512DQ__
	sprintf(szBuf, "__AVX512DQ__ = %d\n", __AVX512DQ__);
	MY_TRACE(szBuf);
#endif

#ifdef __AVX512F__
	sprintf(szBuf, "__AVX512F__ = %d\n", __AVX512F__);
	MY_TRACE(szBuf);
#endif

#ifdef __AVX512VL__
	sprintf(szBuf, "__AVX512VL__ = %d\n", __AVX512VL__);
	MY_TRACE(szBuf);
#endif

#ifdef _CHAR_UNSIGNED
	sprintf(szBuf, "_CHAR_UNSIGNED = %d\n", _CHAR_UNSIGNED);
	MY_TRACE(szBuf);
#endif

#ifdef __CLR_VER
	sprintf(szBuf, "__CLR_VER = %s\n", __CLR_VER);
	MY_TRACE(szBuf);
#endif

#ifdef _CONTROL_FLOW_GUARD
	sprintf(szBuf, "_CONTROL_FLOW_GUARD = %d\n", _CONTROL_FLOW_GUARD);
	MY_TRACE(szBuf);
#endif 

#ifdef __COUNTER__
	// __COUNTER__ 是由编译器自增的ID, 用一次就__COUNTER__++
	sprintf(szBuf, "__COUNTER__ = %d\n", __COUNTER__); // __COUNTER__ = 0
	MY_TRACE(szBuf);

	// printf("__COUNTER__ = %d\n", __COUNTER__); // __COUNTER__ = 1
	// MY_TRACE(szBuf);

	// printf("__COUNTER__ = %d\n", __COUNTER__); // __COUNTER__ = 2
	// MY_TRACE(szBuf);
#endif

#ifdef __cplusplus_cli
	sprintf(szBuf, "__cplusplus_cli = %s\n", __cplusplus_cli);
	MY_TRACE(szBuf);
#endif

#ifdef __cplusplus_winrt
	sprintf(szBuf, "__cplusplus_winrt = %d\n", __cplusplus_winrt);
	MY_TRACE(szBuf);
#endif

#ifdef _CPPRTTI
	sprintf(szBuf, "_CPPRTTI = %d\n", _CPPRTTI);
	MY_TRACE(szBuf);
#endif

#ifdef _CPPUNWIND
	sprintf(szBuf, "_CPPUNWIND = %d\n", _CPPUNWIND);
	MY_TRACE(szBuf);
#endif

#ifdef _DEBUG
	sprintf(szBuf, "_DEBUG = %d\n", _DEBUG);
	MY_TRACE(szBuf);
#endif

#ifdef _DLL
	sprintf(szBuf, "_DLL = %d\n", _DLL);
	MY_TRACE(szBuf);
#endif

#ifdef __FUNCDNAME__
	sprintf(szBuf, "__FUNCDNAME__ = %s\n", __FUNCDNAME__);
	MY_TRACE(szBuf);
#endif

#ifdef __FUNCSIG__
	sprintf(szBuf, "__FUNCSIG__ = %s\n", __FUNCSIG__);
	MY_TRACE(szBuf);
#endif

#ifdef __FUNCTION__
	sprintf(szBuf, "__FUNCTION__ = %s\n", __FUNCTION__);
	MY_TRACE(szBuf);
#endif

#ifdef _INTEGRAL_MAX_BITS
	sprintf(szBuf, "_INTEGRAL_MAX_BITS = %d\n", _INTEGRAL_MAX_BITS);
	MY_TRACE(szBuf);
#endif

#ifdef __INTELLISENSE__
	sprintf(szBuf, "__INTELLISENSE__ = %d\n", __INTELLISENSE__);
	MY_TRACE(szBuf);
#endif

#ifdef _ISO_VOLATILE
	sprintf(szBuf, "_ISO_VOLATILE = %d\n", _ISO_VOLATILE);
	MY_TRACE(szBuf);
#endif

#ifdef _KERNEL_MODE
	sprintf(szBuf, "_KERNEL_MODE = %d\n", _KERNEL_MODE);
	MY_TRACE(szBuf);
#endif

#ifdef _M_AMD64
	sprintf(szBuf, "_M_AMD64 = %d\n", _M_AMD64);
	MY_TRACE(szBuf);
#endif

#ifdef _M_ARM
	sprintf(szBuf, "_M_ARM = %d\n", _M_ARM);
	MY_TRACE(szBuf);
#endif

#ifdef _M_ARM_ARMV7VE
	sprintf(szBuf, "_M_ARM_ARMV7VE = %d\n", _M_ARM_ARMV7VE);
	MY_TRACE(szBuf);
#endif

#ifdef _M_ARM_FP
	sprintf(szBuf, "_M_ARM_FP = %d\n", _M_ARM_FP);
	MY_TRACE(szBuf);
#endif

#ifdef _M_ARM64
	sprintf(szBuf, "_M_ARM64 = %d\n", _M_ARM64);
	MY_TRACE(szBuf);
#endif

#ifdef _M_ARM64EC
	sprintf(szBuf, "_M_ARM64EC = %d\n", _M_ARM64EC);
	MY_TRACE(szBuf);
#endif

#ifdef _M_CEE
	sprintf(szBuf, "_M_CEE = %d\n", _M_CEE);
	MY_TRACE(szBuf);
#endif

#ifdef _M_CEE_PURE
	sprintf(szBuf, "_M_CEE_PURE = %d\n", _M_CEE_PURE);
	MY_TRACE(szBuf);
#endif

#ifdef _M_CEE_SAFE
	sprintf(szBuf, "_M_CEE_SAFE = %d\n", _M_CEE_SAFE);
	MY_TRACE(szBuf);
#endif

#ifdef _M_FP_CONTRACT
	sprintf(szBuf, "_M_FP_CONTRACT = %d\n", _M_FP_CONTRACT);
	MY_TRACE(szBuf);
#endif

#ifdef _M_FP_EXCEPT
	sprintf(szBuf, "_M_FP_EXCEPT = %d\n", _M_FP_EXCEPT);
	MY_TRACE(szBuf);
#endif

#ifdef _M_FP_FAST
	sprintf(szBuf, "_M_FP_FAST = %d\n", _M_FP_FAST);
	MY_TRACE(szBuf);
#endif

#ifdef _M_FP_PRECISE
	sprintf(szBuf, "_M_FP_PRECISE = %d\n", _M_FP_PRECISE);
	MY_TRACE(szBuf);
#endif

#ifdef _M_FP_STRICT
	sprintf(szBuf, "_M_FP_STRICT = %d\n", _M_FP_STRICT);
	MY_TRACE(szBuf);
#endif

#ifdef _M_IX86
	sprintf(szBuf, "_M_IX86 = %d\n", _M_IX86);
	MY_TRACE(szBuf);
#endif

#ifdef _M_IX86_FP
	sprintf(szBuf, "_M_IX86_FP = %d\n", _M_IX86_FP);
	MY_TRACE(szBuf);
#endif

#ifdef _M_X64
	sprintf(szBuf, "_M_X64 = %d\n", _M_X64);
	MY_TRACE(szBuf);
#endif

#ifdef _MANAGED
	sprintf(szBuf, "_MANAGED = %d\n", _MANAGED);
	MY_TRACE(szBuf);
#endif

#ifdef _MSC_BUILD
	sprintf(szBuf, "_MSC_BUILD = %d\n", _MSC_BUILD);
	MY_TRACE(szBuf);
#endif

#ifdef _MSC_EXTENSIONS
	sprintf(szBuf, "_MSC_EXTENSIONS = %d\n", _MSC_EXTENSIONS);
	MY_TRACE(szBuf);
#endif

#ifdef _MSC_FULL_VER
	sprintf(szBuf, "_MSC_FULL_VER = %d\n", _MSC_FULL_VER);
	MY_TRACE(szBuf);
#endif

#ifdef _MSC_VER
	sprintf(szBuf, "_MSC_VER = %d\n", _MSC_VER);
	MY_TRACE(szBuf);
#endif

#ifdef _MSVC_LANG
	sprintf(szBuf, "_MSVC_LANG = %d\n", _MSVC_LANG);
	MY_TRACE(szBuf);
#endif

#ifdef __MSVC_RUNTIME_CHECKS
	sprintf(szBuf, "__MSVC_RUNTIME_CHECKS = %d\n", __MSVC_RUNTIME_CHECKS);
	MY_TRACE(szBuf);
#endif

#ifdef _MSVC_TRADITIONAL
	sprintf(szBuf, "_MSVC_TRADITIONAL = %d\n", _MSVC_TRADITIONAL);
	MY_TRACE(szBuf);
#endif

#ifdef _MT
	sprintf(szBuf, "_MT = %d\n", _MT);
	MY_TRACE(szBuf);
#endif

#ifdef _NATIVE_WCHAR_T_DEFINED
	sprintf(szBuf, "_NATIVE_WCHAR_T_DEFINED = %d\n", _NATIVE_WCHAR_T_DEFINED);
	MY_TRACE(szBuf);
#endif

#ifdef _OPENMP
	sprintf(szBuf, "_OPENMP = %d\n", _OPENMP);
	MY_TRACE(szBuf);
#endif

#ifdef _PREFAST_
	sprintf(szBuf, "_PREFAST_ = %d\n", _PREFAST_);
	MY_TRACE(szBuf);
#endif

#ifdef __SANITIZE_ADDRESS__
	sprintf(szBuf, "__SANITIZE_ADDRESS__ = %d\n", __SANITIZE_ADDRESS__);
	MY_TRACE(szBuf);
#endif

#ifdef __TIMESTAMP__
	sprintf(szBuf, "__TIMESTAMP__ = %s\n", __TIMESTAMP__);
	MY_TRACE(szBuf);
#endif

#ifdef _VC_NODEFAULTLIB
	sprintf(szBuf, "_VC_NODEFAULTLIB = %d\n", _VC_NODEFAULTLIB);
	MY_TRACE(szBuf);
#endif

#ifdef _WCHAR_T_DEFINED
	sprintf(szBuf, "_WCHAR_T_DEFINED = %d\n", _WCHAR_T_DEFINED);
	MY_TRACE(szBuf);
#endif

#ifdef _WIN32
	sprintf(szBuf, "_WIN32 = %d\n", _WIN32);
	MY_TRACE(szBuf);
#endif

#ifdef _WIN64
	sprintf(szBuf, "_WIN64 = %d\n", _WIN64);
	MY_TRACE(szBuf);
#endif

#ifdef _WINRT_DLL
	sprintf(szBuf, "_WINRT_DLL = %d\n", _WINRT_DLL);
	MY_TRACE(szBuf);
#endif

#ifdef _ATL_VER
	sprintf(szBuf, "_ATL_VER  = %d\n", _ATL_VER);
	MY_TRACE(szBuf);
#endif

#ifdef _MFC_VER
	sprintf(szBuf, "_MFC_VER = %d\n", _MFC_VER);
	MY_TRACE(szBuf);
#endif

	sprintf(szBuf, "==================== vs predefined macros END ====================\n");
	MY_TRACE(szBuf);
}


END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值