查找某个宏所在的位置 #define-ed
Find place where some macro was #define-ed
底线:使用 VS2012 构建,在我的项目中定义了一个宏 (WIN32_LEAN_AND_MEAN) 我在任何地方都找不到 #define-ed:不在 C/C++ 中 - -> 预处理器,不继承自 parent 或项目依赖项 (microsoft.cpp.props),不在 command-line 中。 vcxproj 中的任何地方都没有提到它。
在项目中编译单个source/header,我发现它已经在header的第一行定义了。把它放在我的 header:
的顶部
#pragma once
#ifndef WIN32_LEAN_AND_MEAN
#pragma message ("WIN32_LEAN_AND_MEAN not defined")
#else
#pragma message ("WIN32_LEAN_AND_MEAN defined")
#endif
/* ... */
将“WIN32_LEAN_AND_MEAN defined
”打印到构建输出控制台。
根据 in another - very similar - question 发布的建议,我尝试 re-define 宏:
#define WIN32_LEAN_AND_MEAN 123
#ifndef WIN32_LEAN_AND_MEAN
#pragma message ("WIN32_LEAN_AND_MEAN not defined")
#else
#pragma message ("WIN32_LEAN_AND_MEAN defined")
#endif
显然会收到构建警告:
C:\sys\inc\myproj\myproj_someheader.h(5): warning C4005: 'WIN32_LEAN_AND_MEAN' : macro redefinition
command-line arguments : see previous definition of 'WIN32_LEAN_AND_MEAN'
但是,如前所述,当前定义的宏不在该项目配置 (vcxproj
) 中,也不在任何公共属性中。
我的问题是:我怎样才能找到那个宏的实际来源?
您的开发系统上没有任何地方 #define WIN32_LEAN_AND_MEAN
。
有很多 #ifdef WIN32_LEAN_AND_MEAN
(或等同物)。
重点是你定义它,如果你需要it/want它
http://web.archive.org/web/20121219084749/http://support.microsoft.com/kb/166474
VC_EXTRALEAN and WIN32_LEAN_AND_MEAN are used to exclude rarely-used
services from Windows headers. VC_EXTRALEAN can only be used in MFC
projects, but WIN32_LEAN_AND_MEAN can be used in any project.
如果您想查看如何为您的特定项目扩展宏,您可以使用 /P
开关,并查看相应的 .i 文件:
The C++ compiler has a /P switch which means pre-process to a file.
You can enable this from Project -> Properties -> Configuration
Properties -> C/C++ -> Preprocessor -> Preprocess to a File.
After this option is set, you will get a .i file for every .cpp file.
Be warned that these .i files are huge files.
附录:
我进入 MSVS 2015 并创建了一个 quick'n'dirty 测试程序:
// TestWin32LeanAndMean.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#ifndef WIN32_LEAN_AND_MEAN
#pragma message ("WIN32_LEAN_AND_MEAN not defined")
#else
#pragma message ("WIN32_LEAN_AND_MEAN defined")
#endif
int main()
{
std::cout << "Hello World" << std::endl;
return 0;
}
编译器日志:
1>------ 构建开始:项目:TestWin32LeanAndMean,配置:调试 Win32 ------
1> stdafx.cpp
1> TestWin32LeanAndMean.cpp
1> WIN32_LEAN_AND_MEAN 未定义
1> TestWin32LeanAndMean.vcxproj -> D:\paul\proj\msvs_2015\TestWin32LeanAndMean\Debug\TestWin32LeanAndMean.exe
========== 构建:1 次成功,0 次失败,0 次更新,0 次跳过 ==========
然后我进入项目 > 属性 > 预处理器,并添加 "WIN32_LEAN_AND_MEAN":
MSVS 预处理器定义:
_DEBUG;_CONSOLE;%(PreprocessorDefinitions);WIN32_LEAN_AND_MEAN
构建仍然表示"undefined"(?!?)
1>------ 构建开始:项目:TestWin32LeanAndMean,配置:调试 Win32 ------
1> stdafx.cpp
1> TestWin32LeanAndMean.cpp
1> WIN32_LEAN_AND_MEAN 未定义
1> TestWin32LeanAndMean.vcxproj -> D:\paul\proj\msvs_2015\TestWin32LeanAndMean\Debug\TestWin32LeanAndMean.exe
所以我手动编辑了我的 .vcsproj 文件并重建了:
TestWin32LeanAndMean.vcxproj:
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
...
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
...
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
...
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
...
我终于得到了WIN32_LEAN_AND_MEAN”的定义:
1>------ Rebuild All started: Project: TestWin32LeanAndMean, Configuration: Debug Win32 ------
1> stdafx.cpp
1> TestWin32LeanAndMean.cpp
1> WIN32_LEAN_AND_MEAN defined
1> TestWin32LeanAndMean.vcxproj -> D:\paul\proj\msvs_2015 \TestWin32LeanAndMean\Debug\TestWin32LeanAndMean.exe
要准确查看 MSVS 宏预处理器在做什么,您应该能够使用“/P”("Preprocess to a file")。
根据我的经验 - 在上面的测试中 - "WIN32_LEAN_AND_MEAN" 在环境中通常 NOT DEFINED。
如果它 IS 以某种方式定义,要查看的地方将是:
a) MSVS > 项目 > 属性
b) Windows 资源管理器 > 项目 > .vcxproj 文件
c) MSVS 安装文件夹 > 模板 > ProjectTemplates
查看项目属性(项目属性->C/C++->预处理器->预处理器定义和 C/C++->命令行)后,vcxproj 本身(查看如果为特定的源文件配置了预处理器定义),公共属性(在Microsoft.Cpp.Props中配置),headers和source-code,在没有定义WIN32_LEAN_AND_MEAN的地方,事实证明它由 %CL% 环境变量定义。
底线:使用 VS2012 构建,在我的项目中定义了一个宏 (WIN32_LEAN_AND_MEAN) 我在任何地方都找不到 #define-ed:不在 C/C++ 中 - -> 预处理器,不继承自 parent 或项目依赖项 (microsoft.cpp.props),不在 command-line 中。 vcxproj 中的任何地方都没有提到它。
在项目中编译单个source/header,我发现它已经在header的第一行定义了。把它放在我的 header:
的顶部#pragma once
#ifndef WIN32_LEAN_AND_MEAN
#pragma message ("WIN32_LEAN_AND_MEAN not defined")
#else
#pragma message ("WIN32_LEAN_AND_MEAN defined")
#endif
/* ... */
将“WIN32_LEAN_AND_MEAN defined
”打印到构建输出控制台。
根据 in another - very similar - question 发布的建议,我尝试 re-define 宏:
#define WIN32_LEAN_AND_MEAN 123
#ifndef WIN32_LEAN_AND_MEAN
#pragma message ("WIN32_LEAN_AND_MEAN not defined")
#else
#pragma message ("WIN32_LEAN_AND_MEAN defined")
#endif
显然会收到构建警告:
C:\sys\inc\myproj\myproj_someheader.h(5): warning C4005: 'WIN32_LEAN_AND_MEAN' : macro redefinition
command-line arguments : see previous definition of 'WIN32_LEAN_AND_MEAN'
但是,如前所述,当前定义的宏不在该项目配置 (vcxproj
) 中,也不在任何公共属性中。
我的问题是:我怎样才能找到那个宏的实际来源?
您的开发系统上没有任何地方 #define WIN32_LEAN_AND_MEAN
。
有很多 #ifdef WIN32_LEAN_AND_MEAN
(或等同物)。
重点是你定义它,如果你需要it/want它
http://web.archive.org/web/20121219084749/http://support.microsoft.com/kb/166474
VC_EXTRALEAN and WIN32_LEAN_AND_MEAN are used to exclude rarely-used services from Windows headers. VC_EXTRALEAN can only be used in MFC projects, but WIN32_LEAN_AND_MEAN can be used in any project.
如果您想查看如何为您的特定项目扩展宏,您可以使用 /P
开关,并查看相应的 .i 文件:
The C++ compiler has a /P switch which means pre-process to a file.
You can enable this from Project -> Properties -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocess to a File.
After this option is set, you will get a .i file for every .cpp file.
Be warned that these .i files are huge files.
附录:
我进入 MSVS 2015 并创建了一个 quick'n'dirty 测试程序:
// TestWin32LeanAndMean.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #ifndef WIN32_LEAN_AND_MEAN #pragma message ("WIN32_LEAN_AND_MEAN not defined") #else #pragma message ("WIN32_LEAN_AND_MEAN defined") #endif int main() { std::cout << "Hello World" << std::endl; return 0; }
编译器日志:
1>------ 构建开始:项目:TestWin32LeanAndMean,配置:调试 Win32 ------ 1> stdafx.cpp 1> TestWin32LeanAndMean.cpp 1> WIN32_LEAN_AND_MEAN 未定义 1> TestWin32LeanAndMean.vcxproj -> D:\paul\proj\msvs_2015\TestWin32LeanAndMean\Debug\TestWin32LeanAndMean.exe ========== 构建:1 次成功,0 次失败,0 次更新,0 次跳过 ==========
然后我进入项目 > 属性 > 预处理器,并添加 "WIN32_LEAN_AND_MEAN":
MSVS 预处理器定义:
_DEBUG;_CONSOLE;%(PreprocessorDefinitions);WIN32_LEAN_AND_MEAN
构建仍然表示"undefined"(?!?)
1>------ 构建开始:项目:TestWin32LeanAndMean,配置:调试 Win32 ------ 1> stdafx.cpp 1> TestWin32LeanAndMean.cpp 1> WIN32_LEAN_AND_MEAN 未定义 1> TestWin32LeanAndMean.vcxproj -> D:\paul\proj\msvs_2015\TestWin32LeanAndMean\Debug\TestWin32LeanAndMean.exe
所以我手动编辑了我的 .vcsproj 文件并重建了:
TestWin32LeanAndMean.vcxproj:
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ClCompile> <PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> ... <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ClCompile> <PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> ... <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ClCompile> <PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> ... <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ClCompile> <PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> ...
我终于得到了WIN32_LEAN_AND_MEAN”的定义:
1>------ Rebuild All started: Project: TestWin32LeanAndMean, Configuration: Debug Win32 ------ 1> stdafx.cpp 1> TestWin32LeanAndMean.cpp 1> WIN32_LEAN_AND_MEAN defined 1> TestWin32LeanAndMean.vcxproj -> D:\paul\proj\msvs_2015 \TestWin32LeanAndMean\Debug\TestWin32LeanAndMean.exe
要准确查看 MSVS 宏预处理器在做什么,您应该能够使用“/P”("Preprocess to a file")。
根据我的经验 - 在上面的测试中 - "WIN32_LEAN_AND_MEAN" 在环境中通常 NOT DEFINED。
如果它 IS 以某种方式定义,要查看的地方将是:
a) MSVS > 项目 > 属性
b) Windows 资源管理器 > 项目 > .vcxproj 文件
c) MSVS 安装文件夹 > 模板 > ProjectTemplates
查看项目属性(项目属性->C/C++->预处理器->预处理器定义和 C/C++->命令行)后,vcxproj 本身(查看如果为特定的源文件配置了预处理器定义),公共属性(在Microsoft.Cpp.Props中配置),headers和source-code,在没有定义WIN32_LEAN_AND_MEAN的地方,事实证明它由 %CL% 环境变量定义。