Как эхо | g++ работает в следующем скрипте

На основе gcc: мне нужен -D_REENTRANT с pthreads?

> echo | g++          -E -dM -c - > singlethreaded
> echo | g++ -pthread -E -dM -c - > multithreaded
> diff singlethreaded multithreaded
39a40
> #define _REENTRANT 1

Автор использует приведенную выше команду для экспорта параметров, используемых компилятором. Я хочу знать, почему такая команда работает в деталях:

> echo | g++ -E -dM -c - > singlethreaded

Я понимаю следующие части:

> singlethread # means to redirect the results to the file singlethread

person q0987    schedule 05.07.2011    source источник


Ответы (2)


Вариант -dM:

Вместо обычного вывода создайте список директив #define для всех макросов, определенных во время выполнения препроцессора, включая предопределенные макросы. Это дает вам возможность узнать, что предопределено в вашей версии препроцессора.

Вариант -E:

Остановиться после этапа предварительной обработки; не запускайте собственно компилятор. Вывод представляет собой предварительно обработанный исходный код, который отправляется на стандартный вывод.

Параметр -c заставляет компилятор компилировать, но не связывать. Это излишне с опцией -E.

Одиночное - сообщает компилятору, что нужно прочитать его ввод со стандартного ввода.

Таким образом, команда повторяет пустой поток в stdout, направляет этот пустой поток в g++, который затем считывает пустой поток, но запускает только препроцессор, которому было приказано игнорировать ввод (пустой) и выводить полный список определенных макросов препроцессора. .

person Jim Garrison    schedule 06.07.2011
comment
вы видите, что после "-c" стоит "-"? '-' означает ?? - person q0987; 06.07.2011
comment
Я пропустил это в первый раз и перепутал -c -- я исправил ответ. - person Jim Garrison; 06.07.2011

echo | g++ - говорит g++ скомпилировать stdin и передает пустую программу (пустая строка из echo). Параметр -E вызывает только препроцессор (это похоже на запуск cpp напрямую, но с любыми макросами, автоматически определенными g++). Параметр -dM — это флаг отладки, который выводит состояние внутри компилятора на определенном этапе:

       -dM
       -fdump-rtl-mach
           Dump after performing the machine dependent reorganization
           pass, to file.155r.mach.

Цель всего этого состоит в том, чтобы обнаружить, какие макросы компилятор устанавливает по-разному, когда вы меняете параметр командной строки -pthread, сравнивая вывод этого дампа.

person Ben Jackson    schedule 06.07.2011