Найти место, где какой-то макрос был # define-ed - PullRequest
0 голосов
/ 14 января 2019

Суть: сборка с VS2012, есть макрос (WIN32_LEAN_AND_MEAN), определенный в моем проекте, я не могу найти # define-ed где-либо: нет в C / C ++ -> препроцессоре, не унаследован от родительских или проектных зависимостей ( microsoft.cpp.props), а не в командной строке. Это нигде не упоминается в vcxproj.

Компилируя один источник / заголовок в проекте, я обнаружил, что он уже определен в первой строке заголовка. Поместив это в верхней части моего заголовка:

#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" на консоли вывода сборки.

Согласно предложениям, которые были размещены в другом - очень похожем - вопросе , я попытался переопределить макрос:

#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): предупреждение C4005: 'WIN32_LEAN_AND_MEAN': переопределение макроса

аргументы командной строки: см. Предыдущее определение 'WIN32_LEAN_AND_MEAN'

Однако, как упоминалось ранее, этот макрос не определен в этой конфигурации проекта (vcxproj), а также в каких-либо общих свойствах.

Мой вопрос : Как я могу найти, откуда на самом деле появился этот макрос?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

После просмотра свойств проекта (Свойства проекта-> C / C ++ -> Препроцессор-> Определения препроцессора и C / C ++ -> Командная строка), сам vcxproj (смотрел, есть ли Определения препроцессора, настроенные для конкретного источника файл), общие свойства (настроенные в Microsoft.Cpp.Props), заголовки и исходный код, нигде, где был определен WIN32_LEAN_AND_MEAN, оказывается, что он был определен переменной среды % CL% .

0 голосов
/ 14 января 2019

В вашей системе разработки нет #define WIN32_LEAN_AND_MEAN.

Есть множество #ifdef WIN32_LEAN_AND_MEAN (или эквивалент).

Дело в том, что вы определяете это, если вам это нужно / хотите.

http://web.archive.org/web/20121219084749/http://support.microsoft.com/kb/166474

VC_EXTRALEAN и WIN32_LEAN_AND_MEAN используются для исключения редко используемых сервисы из заголовков Windows. VC_EXTRALEAN можно использовать только в MFC проекты, но WIN32_LEAN_AND_MEAN можно использовать в любом проекте.

Если вы хотите увидеть, как макросы расширяются для вашего конкретного проекта, вы можете использовать переключатель /P и посмотреть соответствующий файл .i:

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

Компилятор C ++ имеет переключатель / P, который означает предварительную обработку файла.

Вы можете включить это в Project -> Properties -> Configuration. Свойства -> C / C ++ -> Препроцессор -> Предварительная обработка в файл.

После установки этой опции вы получите файл .i для каждого файла .cpp.

Имейте в виду, что эти файлы .i являются огромными.


ДОПОЛНЕНИЕ:

  1. Я пошел в MSVS 2015 и создал тестовую программу для быстрого и грязного:

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

    В сборке все еще сказано "неопределено" (?!?)

    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» («Предварительная обработка в файл»).

  5. По моему опыту - и в тесте выше - "WIN32_LEAN_AND_MEAN" обычно НЕ ОПРЕДЕЛЕН в среде.

  6. Если это IS как-то определено, места для поиска будут:

    a) MSVS> Проект> Свойства

    b) Проводник Windows> Проект> .vcxproj file

    c) Папка установки MSVS> Шаблоны> Шаблоны проектов

...