Существует ли какая-либо директива #pragma или аналогичная директива для сгенерированного кода C # для сопоставления номеров строк кода шаблона с номером строки C #?
-
20-09-2019 - |
Вопрос
У меня есть система шаблонов, которая выглядит аналогично старому ASP-коду.Я запускаю это через класс, который полностью переписывает это в исходный код C #, компилирует и, наконец, выполняет.
Что мне интересно, так это есть ли какая-то директива, подобная #pragma, которой я могу снабдить сгенерированный код C #, который приведет к тому, что ошибки компиляции будут соответствовать номерам строк в моем файле шаблона?
Например, допустим, у меня есть эта первая и единственная строка в коде моего шаблона:
Object o = datta; // should be data, compiler error
но затем, чтобы скомпилировать это, я должен добавить к нему пространство имен, класс, метод и некоторый базовый код, так что эта строка выше, которая является строкой № 1 в моем файле шаблона, на самом деле оказывается строкой № 17 (случайное число, просто для иллюстрации) в коде C #.Ошибка компилятора, естественно, пометит мою ошибку как находящуюся в строке # 17, а не в строке # 1.
Я помню из другого языка программирования, который я использовал раньше (хотя не могу вспомнить, какого именно), что в нем была директива, которую я мог бы добавить, что привело бы к выравниванию номеров строк ошибок.
Есть ли что-нибудь подобное в C # 3.5?
Решение
У вас есть #line
директива препроцессора.
#line
позволяет изменять номер строки компилятора и (необязательно) имя файла, выводимого для ошибок и предупреждений.Тот Самый
#line directive
может быть использован на автоматизированном промежуточном этапе процесса сборки.Например, если строки были удалены из исходного файла исходного кода, но вы по-прежнему хотели, чтобы компилятор генерировал выходные данные на основе исходной нумерации строк в файле, вы могли бы удалить строки, а затем имитировать исходную нумерацию строк с помощью#line
.Тот Самый
#line hidden
директива скрывает последовательные строки от отладчика, так что, когда разработчик выполняет пошаговое выполнение кода, любые строки между#line hidden
и следующий#line
директива (при условии, что это не другая скрытая директива #line) будет перешагнута.Этот параметр также можно использовать, чтобы разрешить ASP.NET различать пользовательский и машинный код.Хотя ASP.NET является основным потребителем этой функции, вполне вероятно, что ею воспользуются другие генераторы исходных текстов.A
#line hidden
директива не влияет на имена файлов или номера строк в отчетах об ошибках.То есть, если в скрытом блоке обнаружена ошибка, компилятор сообщит текущее имя файла и номер строки ошибки.Тот Самый
#line filename
директива указывает имя файла, которое вы хотите отобразить в выходных данных компилятора.По умолчанию используется фактическое имя файла исходного кода.Имя файла должно быть заключено в двойные кавычки ("") и ему должен предшествовать номер строки.