Вывести имя типа во время компиляции без прерывания компиляции? - PullRequest
7 голосов
/ 13 февраля 2020

В этом вопросе:

Печатать имя типа шаблона во время компиляции

У нас есть несколько предложений о том, как заставить типичные компиляторы C ++ печатать имя типа, в время компиляции. Однако они полагаются на ошибку компиляции.

Мой вопрос: могу ли я заставить компилятор C ++ напечатать имя типа без остановки компиляции?

В общем ответ «вероятно, нет», потому что действительная программа может быть скомпилирована в ее целевой объект, нигде ничего не печатая, поэтому я спрашиваю конкретно о G CC и clang, с возможным использованием директив препроцессора, встроенных компиляторов или любых других Специфика компилятора c трюк.

Примечания:

  • Очевидно, что проблема заключается в печати типов за using/typedef операторами, значениями параметров шаблона, variadi c templates et c. Если тип доступен явно, вы можете просто использовать что-то вроде #message "my type is unsigned long long" (как предложено @NutCracker). Но это , а не , о чем вопрос.
  • Ответы, основанные на C ++ 11 или более ранних версиях, предпочтительнее, чем C ++ 14/17 / 20.

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

g cc и clang предлагает некоторый интерфейс для использования собственных плагинов, которые могут делать практически все на разных этапах от синтаксического анализа до генерации кода.

Интерфейсы определяются спецификацией компилятора c и, как этот плагин для g cc не может быть использован для лягушек или наоборот.

Документация неверна, и здесь нет никаких шансов для go в каких-либо подробностях, поэтому я только указываю на документы из g cc и лязг:

г cc плагин плагин лягушки

0 голосов
/ 14 февраля 2020

Следующий механизм связан с @JonathanWakely и задает c для G CC:

int i;

template <typename T>
[[gnu::warning("your type here")]]
bool print_type() { return true; }

bool b = print_type<decltype(i)>();

Это дает вам:

<source>:In function 'void __static_initialization_and_destruction_0(int, int)':
<source>:7:33: warning: call to 'print_type<int>' declared with attribute warning: your
type here [-Wattribute-warning]
    7 | bool b = print_type<decltype(i)>();
      |          ~~~~~~~~~~~~~~~~~~~~~~~^~

Смотрите это работает над Годболтом .

...