Допустим, я создаю достаточно большую базу кода
где я собираю целую кучу файлов в одной команде, используя целую кучу флагов компилятора в компиляторе Visual C ++, например так:
CL.exe /c /I..\..\JuceLibraryCode /I..\..\JuceLibraryCode\modules /ZI /nologo /W4 /WX- /MP1 /Od /Oy- /D WIN32 /D _WINDOWS /D DEBUG /D _DEBUG /D JUCE_UNIT_TESTS=1 /D JUCER_VS2014_78A5021=1 /D JUCE_APP_VERSION=3.0.0 /D JUCE_APP_VERSION_HEX=0x30000 /D _MBCS /Gm- /EHsc /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /GR /Fo"Debug\\" /Fd"Debug\\vc140.pdb" /Gd /TP /analyze- /errorReport:prompt ..\..\Source\Main.cpp ..\..\Source\MainWindow.cpp ..\..\Source\IntroScreen.cpp ..\..\Source\Demos\AnimationDemo.cpp ..\..\Source\Demos\AudioLatencyDemo.cpp ..\..\Source\Demos\AudioPlaybackDemo.cpp ..\..\Source\Demos\AudioRecordingDemo.cpp ..\..\Source\Demos\AudioSettingsDemo.cpp ..\..\Source\Demos\AudioSynthesiserDemo.cpp ..\..\Source\Demos\Box2DDemo.cpp ..\..\Source\Demos\CameraDemo.cpp ..\..\Source\Demos\ChildProcessDemo.cpp ..\..\Source\Demos\CodeEditorDemo.cpp ..\..\Source\Demos\ComponentTransformsDemo.cpp ..\..\Source\Demos\CryptographyDemo.cpp ..\..\Source\Demos\DialogsDemo.cpp ..\..\Source\Demos\FontsDemo.cpp ..\..\Source\Demos\GraphicsDemo.cpp ..\..\Source\Demos\ImagesDemo.cpp ..\..\Source\Demos\JavaScript.cpp ..\..\Source\Demos\KeyMappingsDemo.cpp ..\..\Source\Demos\LiveConstantDemo.cpp ..\..\Source\Demos\LookAndFeelDemo.cpp ..\..\Source\Demos\MDIDemo.cpp ..\..\Source\Demos\MidiDemo.cpp ..\..\Source\Demos\MultithreadingDemo.cpp ..\..\Source\Demos\MultiTouch.cpp ..\..\Source\Demos\NetworkingDemo.cpp ..\..\Source\Demos\OpenGLDemo.cpp ..\..\Source\Demos\OpenGLDemo2D.cpp ..\..\Source\Demos\PropertiesDemo.cpp ..\..\Source\Demos\SystemInfoDemo.cpp ..\..\Source\Demos\TimersAndEventsDemo.cpp ..\..\Source\Demos\UnitTestsDemo.cpp ..\..\Source\Demos\ValueTreesDemo.cpp ..\..\Source\Demos\VideoDemo.cpp ..\..\Source\Demos\WebBrowserDemo.cpp ..\..\Source\Demos\WidgetsDemo.cpp ..\..\Source\Demos\WindowsDemo.cpp ..\..\Source\Demos\XMLandJSONDemo.cpp ..\..\JuceLibraryCode\BinaryData.cpp ..\..\JuceLibraryCode\modules\juce_audio_basics\juce_audio_basics.cpp ..\..\JuceLibraryCode\modules\juce_audio_devices\juce_audio_devices.cpp ..\..\JuceLibraryCode\modules\juce_audio_formats\juce_audio_formats.cpp ..\..\JuceLibraryCode\modules\juce_audio_processors\juce_audio_processors.cpp ..\..\JuceLibraryCode\modules\juce_audio_utils\juce_audio_utils.cpp ..\..\JuceLibraryCode\modules\juce_box2d\juce_box2d.cpp ..\..\JuceLibraryCode\modules\juce_core\juce_core.cpp ..\..\JuceLibraryCode\modules\juce_cryptography\juce_cryptography.cpp ..\..\JuceLibraryCode\modules\juce_data_structures\juce_data_structures.cpp ..\..\JuceLibraryCode\modules\juce_events\juce_events.cpp ..\..\JuceLibraryCode\modules\juce_graphics\juce_graphics.cpp ..\..\JuceLibraryCode\modules\juce_gui_basics\juce_gui_basics.cpp ..\..\JuceLibraryCode\modules\juce_gui_extra\juce_gui_extra.cpp ..\..\JuceLibraryCode\modules\juce_opengl\juce_opengl.cpp ..\..\JuceLibraryCode\modules\juce_video\juce_video.cpp
Допустим, я получил ICE, и он находится в каком-то заголовочном файле, который, очевидно, прямо или косвенно включен в один из исходных файлов (модуль перевода), есть ли способ отследить, какой модуль перевода (исходный файл .cpp) прямо или косвенно ( через какую-то другую голову) включил заголовок, в котором произошел ДВС?
Вывод, который я получаю в консоли, кажется, действительно беспорядочным упорядочением, настолько, что я не могу, просто взглянув на него, легко определить, какой исходный файл содержит заголовок с ICE.
Если вы компилируете с cl /E
вместо /c
, вы получите вывод (на stdout
по умолчанию) со следующими обозначениями, используемыми при первом включении файла в модуль перевода:
#line 1 "...file [path and] name..."
Вы можете посмотреть на #line 1
строка, соответствующая заголовку, в котором сообщается ICE, затем оглянемся на предыдущий #line
s, чтобы увидеть, какие файлы прямо и косвенно включены в него.
Мои комментарии ниже встроены в [[[тройные скобки]]]. Не забудьте определить, включен ли исходный файл вновь или «возвращен» после включения какого-либо другого файла по номеру строки «1» после #line
….
~/dev/tr cat h.h
#pragma once
h one
h two
h three
~/dev/tr cat i.h
#pragma once
#include "h.h"~/dev/tr cat tr1.cpp
#include "h.h"struct X { };
~/dev/tr cat tr2.cpp
#include "i.h"int main()
{
X x;
}
~/dev/tr cl /E tr1.cpp tr2.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
tr1.cpp
#line 1 "tr1.cpp"#line 1 "c:\\home\\anthony\\user\\dev\\tr\\h.h"[[[ above line means prior context of tr1.cpp has #included h.h ]]]
#pragma once
h one
h two
h three
#line 2 "tr1.cpp"[[[ above line means prior context of h.h "popped", returning to
tr1.cpp at line 2 ]]]
struct X { };
tr2.cpp
#line 1 "tr2.cpp"#line 1 "c:\\home\\anthony\\user\\dev\\tr\\i.h"[[[ i.e. tr2.cpp #included i.h ]]]
#pragma once
#line 1 "c:\\home\\anthony\\user\\dev\\tr\\h.h"[[[ i.e. prior context of i.h #included h.h ]]]
#pragma once
h one
h two
h three
#line 3 "c:\\home\\anthony\\user\\dev\\tr\\i.h"[[[ i.e. i.h continues after the "include h.h" line ]]]
#line 2 "tr2.cpp"[[[ i.e. tr2.cpp continues after the "include i.h" line ]]]
int main()
{
X x;
}