Как знать (в GCC), когда данный символ макроса/препроцессора объявляется?

Это, кажется, работает:

trait B {
  def list: List[_ <: Node[_]]

  def as:List[A] = list.collect { case x:A => x }
}
10
задан Brian Tompsett - 汤莱恩 3 June 2016 в 21:11
поделиться

6 ответов

Используйте-E:

# shows preprocessed source with cpp internals removed
g++ -E -P file.cc
# shows preprocessed source kept with macros and include directives 
g++ -E -dD -dI -P file.cc  

Внутренности выше являются маркерами строки для gcc, которые довольно сбивают с толку, когда Вы читаете вывод. -P разделяет их

 -E  Stop after the preprocessing stage; do not run the compiler proper.  
     The output is in the form of preprocessed source code, which is sent to the 
     standard output.

     Input files which don't require preprocessing are ignored.

Примечание: комментарии правильно жалуются, что это - только частичное решение. Это не скажет Вам, когда макрос будет заменен. Это показывает Вам предварительно обработанный источник, который может быть полезным так или иначе.

18
ответ дан 3 December 2019 в 15:53
поделиться

Это справка привычки, которую Вы находите, где это было определено, но Вы видите определение для конкретного файла при помощи флагов-E-dM

g++ -E -dM file.cpp | grep MACRO
2
ответ дан 3 December 2019 в 15:53
поделиться

для "к тому, что это развернет", я использую переключатель-E в gcc, который дает предварительно обработанный вывод. Но нет никакого следа, какой макрос произошел, где от (или если был макрос вообще).

Другая опция, которую Вы могли бы использовать, является-g3, это добавляет отладочную информацию относительно макросов, т.е. можно позже видеть в отладчике определение каждого макроса.

1
ответ дан 3 December 2019 в 15:53
поделиться

Я хотел бы знать (при компиляции .cc файла), когда с #define встречаются,

Я знаю решение этого. Скомпилируйте файл с символом, уже определенным как недопустимый код C++ (статья, связанная с использованием). Так, для GCC Вы записали бы

gcc my_file.c -Dfoo=@

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

Если Вы используете прием, Raymond Chen предлагает, компилятор может сказать Вам, куда "конфликтующее" определение прибыло из и может дать Вам список того, как это было включено. Но нет никакой гарантии. Так как я не использую макросы (я предпочитаю константу и перечисление), я не могу сказать, является ли GCC одним из более умных компиляторов в этом отношении. Я не верю C, или в стандартах C++ говорится что-либо об этом, кроме того, после того как препроцессор работает, Вы теряете все виды полезной информации.

5
ответ дан 3 December 2019 в 15:53
поделиться

Хороший IDE может сделать это для Вас по требованию через некоторую форму перехода к определению.

1
ответ дан 3 December 2019 в 15:53
поделиться

Используйте #warning. Это описано здесь.

0
ответ дан 3 December 2019 в 15:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: