Можно ли использовать условные символы компиляции в шаблонах T4

У меня есть шаблон T4, который используется с TextTemplatingFilePreforcessor для создания класса, который затем можно использовать для создания выходных данных шаблона.

В начале шаблона T4 я импортирую несколько пространств имен. Например,

<#@ import namespace="Company.ProductX.Widgets" #>
<#@ import namespace="Company.ProductX.Services" #>
//...

Я хотел бы использовать Директивы препроцессора , чтобы переключить эти импорт на другой набор пространств имен (которые предоставляют те же интерфейсы, но отличающиеся функциональные возможности ProductX). Например,

<#
#if(ProductX)
{
#>
    <#@ import namespace="Company.ProductX.Widgets" #>
    <#@ import namespace="Company.ProductX.Services" #>
    //...
<#
}
#endif
#>
<#
#if(ProductY)
{
#>
    <#@ import namespace="Company.ProductY.Widgets" #>
    <#@ import namespace="Company.ProductY.Services" #>
    //...
<#
}
#endif
#>

В приведенном выше примере импорт создает соответствующие операторы использования в классе независимо от директивы препроцессора. Например,

using Company.ProductX.Widgets
using Company.ProductX.Services
using Company.ProductY.Widgets
using Company.ProductY.Services

Есть ли другой способ использовать препроцессоры в шаблонах T4, чтобы повлиять на сам шаблон, а не только на вывод шаблона?

-121--1660499-

Что может заставить GDB отказаться от разрыва? Я здесь в проигрыше. Я пишу компилятор на языке Си (для хобби) и компилирую с GCC 4,6,1 на amd64 Linux 2,6,32, используя GDB 7,3. Флаги - «-Wall -Wextra -O0 -g», в дополнение к обычным -I и...

Я теряю здесь. Я пишу компилятор на языке Си (для хобби) и компилирую с GCC 4,6,1 на amd64 Linux 2,6,32, используя GDB 7,3. Флаги - «-Wall -Wextra -O0 -g», в дополнение к обычным -I и whatnot. У меня есть функция, цель которой - сообщить об ошибке синтаксического анализа, определяемая следующим образом:

void cerror_at (struct lex *lex, struct token *tok, const char *fmt, ...)

Кроме того, что она вариабельна, ничего странного. Проблема в том, что GDB НЕ сломается. Я попробовал каждый путь, который я могу придумать (точка останова в функции, внутри функции, перед тем, как она называется, вы назовете ее), но как только моя программа находится внутри функции, я получаю сообщения типа «предупреждение: ошибка удаления точки останова 0» и GDB просто позволяет программе закончить. В этом больше нет ничего плохого (с тех пор я исправил ошибку, которую пытался найти, и все работает как надо), но я не могу попасть в функцию. Какие-либо идеи о том, что может привести к этому?

Изменить: Больше информации! GDB устанавливает точку останова 0x403057. Функция начинается с 0x403025. Посмотрите на эту часть разборки:

0x0000000000403053 <+46>:   test   %al,%al
0x0000000000403055 <+48>:   je     0x403077 

В этот момент она переходит на 0x403077 (за точку останова). Я проверил, что размещение точки останова по адресу до «je» работает, а также по адресу или после 0x403077, цели прыжка, но не между (где GDB пытается разместить его). Почему GDB помещает точку останова в середину функции? Даже GDB говорит мне, что адрес функции, на самом деле, 0x403025.

5
задан c4757p 21 September 2011 в 12:54
поделиться