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);
}