Используются ли компилятором линейные маркеры в выводе препроцессора C? - PullRequest
0 голосов
/ 02 января 2019

Являются ли линейные маркеры (# 1 "donothing.cpp" 2) в выходных данных препроцессора C используемыми компилятором для генерации файла ассемблера (.s)?

Я ожидаю, что они используются для получения ошибок компилятора и отладочной информации.Так что я могу безопасно отключить их (с помощью -P), пытаясь следить за потоком макросов?

Я изучаю C ++ и препроцессор C.Я читал во многих руководствах по C ++, что макросы, как правило, трудно написать правильно и могут привести к неожиданным результатам.Вот пример выходных данных препроцессора. Препроцессор C: Выход препроцессора

$ g++ -Wall -std=c++11 -E donothing.cpp
# 1 "donothing.cpp"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 391 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "donothing.cpp" 2

int main()
{
    return 0;
}
$ g++ -Wall -std=c++11 -E donothing.cpp -P
int main()
{
    return 0;
}

Считает ли вывод препроцессора способ отладки ошибок компилятора?Как еще разработчики c / c ++ отлаживают свои макросы (поскольку я ожидаю, что люди очень часто работают с несколькими файлами .cpp, и всегда возникают ошибки компилятора)?

1 Ответ

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

Директивы с номерами строк имеют две основные цели:

  1. Если компилятор обнаруживает ошибку, он использует самую последнюю директиву с номером строки, чтобы определить, какой файл и строку следует ссылаться в сообщении об ошибке..

    (Директива #line может даже использоваться в сгенерированном коде, чтобы сообщения об ошибках могли указывать непосредственно на исходный исходный файл, а не на промежуточный исходный файл C.) *

  2. Если отладочная информация (-g) включена, данные номера строки включаются в разделы отладки сгенерированного объектного файла.

Ни одна из этих целей не является критической.Если вы смотрите на вывод ассемблера, и вам мешают директивы с номерами строк, не стесняйтесь их отключать.

...