查找某个宏所在的位置 #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 文件:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/162e8850-f442-4283-a419-6c328684388e/showing-how-a-macro-is-expanded?forum=vclanguage

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.


附录:

  1. 我进入 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 次跳过 ==========

  2. 然后我进入项目 > 属性 > 预处理器,并添加 "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

  3. 所以我手动编辑了我的 .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
    
  4. 要准确查看 MSVS 宏预处理器在做什么,您应该能够使用“/P”("Preprocess to a file")。

  5. 根据我的经验 - 在上面的测试中 - "WIN32_LEAN_AND_MEAN" 在环境中通常 NOT DEFINED

  6. 如果它 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% 环境变量定义。