Распечатать compile-time константу в выводе компилятора
От: koenjihyakkei Россия  
Дата: 16.01.23 23:51
Оценка:
Всегда использовал такую лабуду, чтобы напечатать константу в аутпуте компилятора:

template<int>
class Foo;
...
Foo<ParameterToPrint> foo;


Например, при ParameterToPrint=64 напечатает следующее:

error: implicit instantiation of undefined template 'Foo<64>'


Но мне кажется есть более простой вариант сделать это проще и сразу на месте, без объявления класса?
Отредактировано 17.01.2023 0:35 koenjihyakkei . Предыдущая версия . Еще …
Отредактировано 17.01.2023 0:11 koenjihyakkei . Предыдущая версия .
Re: Распечатать compile-time константу в выводе компилятора
От: σ  
Дата: 17.01.23 00:24
Оценка:
static_assert(ParameterToPrint != ParameterToPrint);
static_assert((void*)ParameterToPrint);
static_assert(bool{ParameterToPrint});
Отредактировано 17.01.2023 0:28 σ . Предыдущая версия . Еще …
Отредактировано 17.01.2023 0:27 σ . Предыдущая версия .
Re[2]: Распечатать compile-time константу в выводе компилятора
От: koenjihyakkei Россия  
Дата: 17.01.23 00:30
Оценка:
Здравствуйте, σ, Вы писали:

σ>
static_assert(ParameterToPrint != ParameterToPrint);
σ>static_assert((void*)ParameterToPrint);
σ>static_assert(bool{ParameterToPrint});


Так static_assert же не раскрывает значения условия, просто пишет, что `ParameterToPrint != ParameterToPrint` ложно.
Re[3]: Распечатать compile-time константу в выводе компилятора
От: σ  
Дата: 17.01.23 00:33
Оценка:
K>Так static_assert же не раскрывает значения условия, просто пишет, что `ParameterToPrint != ParameterToPrint` ложно.

https://godbolt.org/z/Kd88EafY9

(Как будто template<int> class Foo; гарантированно раскроет)
Re: Распечатать compile-time константу в выводе компилятора
От: σ  
Дата: 17.01.23 00:36
Оценка:
K>Всегда использовал такую лабуду, чтобы напечатать константу в аутпуте компилятора:

K>Но мне кажется есть более простой вариант сделать это проще и сразу на месте, без объявления класса?


Мышку на ParameterToPrint наведи в VSCode+clangd))0)0
Re[4]: Распечатать compile-time константу в выводе компилятора
От: koenjihyakkei Россия  
Дата: 17.01.23 00:37
Оценка:
Здравствуйте, σ, Вы писали:

σ>(Как будто template<int> class Foo; гарантированно раскроет)


Конечно. Добавил пример вывода в первое сообщение.
Re[5]: Распечатать compile-time константу в выводе компилятора
От: σ  
Дата: 17.01.23 00:40
Оценка:
σ>>(Как будто template<int> class Foo; гарантированно раскроет)

K>Конечно. Добавил пример вывода в первое сообщение.


Ты думаешь я не могу добавить пример вывода во второе?
Re[2]: Распечатать compile-time константу в выводе компилятора
От: koenjihyakkei Россия  
Дата: 17.01.23 00:40
Оценка:
Здравствуйте, σ, Вы писали:

σ>Мышку на ParameterToPrint наведи в VSCode+clangd))0)0


Пользуюсь CLion(там вроде тоже clangd), не показывает. Не думаю, что в VSCode будет лучше.
Re[6]: Распечатать compile-time константу в выводе компилятора
От: koenjihyakkei Россия  
Дата: 17.01.23 00:43
Оценка:
Здравствуйте, σ, Вы писали:

σ>Ты думаешь я не могу добавить пример вывода во второе?


Я ничего не думаю, я лишь хотел сказать, что обновил главное сообщение этой ветки — добавил пример вывода компиляторного лога для моего кейса.
Re: Распечатать compile-time константу в выводе компилятора
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 17.01.23 10:43
Оценка: +1
Здравствуйте, koenjihyakkei, Вы писали:

K>кажется есть более простой вариант сделать это проще и сразу на месте, без объявления класса?


В C/C++ многие простые и очевидные вещи приходится делать через задницу, ибо разработчики языка до таких мелочей не снисходят, они заняты высоким и утонченным.
Re: Распечатать compile-time константу в выводе компилятора
От: rg45 СССР  
Дата: 17.01.23 10:58
Оценка: 7 (2)
Здравствуйте, koenjihyakkei, Вы писали:

K>
K>error: implicit instantiation of undefined template 'Foo<64>'
K>

K>Но мне кажется есть более простой вариант сделать это проще и сразу на месте, без объявления класса?

Можно использовать несоответствие типов формальных и фактических параметров, чтоб спровоцировать ошибку вида: "cannon convert 'A' to 'B'". Осталось только подобрать какую-нибудь функцию, желательно из стандартной библиотеки, чтоб не объявлять свои. Нарпимер printf:

http://coliru.stacked-crooked.com/a/0175402ff442e85d

   const int ParameterToPrint = 42;

   std::printf(std::integral_constant<int, ParameterToPrint>{});


MSVC: "cannot convert argument 1 from 'std::integral_constant<int,42>' to 'const char*"
GCC: "invalid user-defined conversion from 'std::integral_constant<int, 42>' to 'const char*'"
--
Отредактировано 17.01.2023 16:00 rg45 . Предыдущая версия . Еще …
Отредактировано 17.01.2023 11:02 rg45 . Предыдущая версия .
Отредактировано 17.01.2023 11:01 rg45 . Предыдущая версия .
Re[2]: Распечатать compile-time константу в выводе компилятора
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 17.01.23 11:16
Оценка:
Здравствуйте, rg45, Вы писали:

R>Можно использовать несоответствие типов формальных и фактических параметров, чтоб спровоцировать ощибку


В том и задница, что все известные способы завязаны на создание ошибки — и, как следствие, невозможность завершить компиляцию. Если бы разработчики языка меньше думали о высоком и красивом, такие средства давно были бы включены в язык штатно, безо всяких провоцируемых ошибок.
Re[3]: Распечатать compile-time константу в выводе компилятора
От: rg45 СССР  
Дата: 17.01.23 11:21
Оценка: :)))
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>В том и задница, что все известные способы завязаны на создание ошибки — и, как следствие, невозможность завершить компиляцию. Если бы разработчики языка меньше думали о высоком и красивом, такие средства давно были бы включены в язык штатно, безо всяких провоцируемых ошибок.


Как я понимаю, ты хочешь пригласить меня в очередную дискуссию о несовершенстве современного С/С++? Спасибо за приглашение, но я пропущу в этот раз.
--
Re: Распечатать compile-time константу в выводе компилятора
От: T4r4sB Россия  
Дата: 17.01.23 12:12
Оценка: +1
Для строк есть pragma message. А перевести число в строку па этапе комиляции вроде ж можно?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[2]: Распечатать compile-time константу в выводе компилятора
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 17.01.23 12:38
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Для строк есть pragma message.


Там раскрываются только макросы.
Re: Распечатать compile-time константу в выводе компилятора
От: kov_serg Россия  
Дата: 17.01.23 12:54
Оценка: 1 (1)
Здравствуйте, koenjihyakkei, Вы писали:

K>Но мне кажется есть более простой вариант сделать это проще и сразу на месте, без объявления класса?


https://github.com/saarraz/static-print
https://www.youtube.com/watch?v=61w4LbQ0fzU
Re[2]: Распечатать compile-time константу в выводе компилятора
От: koenjihyakkei Россия  
Дата: 17.01.23 17:51
Оценка:
Здравствуйте, kov_serg, Вы писали:

Да, крутой патч, жалко для кланга такого нету.
Re: Распечатать compile-time константу в выводе компилятора
От: ботаныч Интернет https://youtu.be/I3lhN5CUP2M
Дата: 08.02.23 06:31
Оценка:
Здравствуйте, koenjihyakkei, Вы писали:

K>Всегда использовал такую лабуду, чтобы напечатать константу в аутпуте компилятора:


K>Но мне кажется есть более простой вариант сделать это проще и сразу на месте, без объявления класса?


на MSVC компиляторах есть
#pragma message (__FUNCSIG__) обычно заводится
template <typename T> inline void print_type() {
   #pragma message (__FUNCSIG__)
}

и используется для компайл тайм дебага.
нечто подобное но с ворнингами (чаще "-Wuninitialized") делаеnся и в gcc, где выкладка от компайлера обычно глубже по стеку.
Re[2]: Распечатать compile-time константу в выводе компилятора
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.02.23 10:16
Оценка:
Здравствуйте, ботаныч, Вы писали:

Б>
Б>template <typename T> inline void print_type() {
Б>   #pragma message (__FUNCSIG__)
Б>}
Б>


Это очень кривой прием. Если уж использовать шаблон, в него нужно вставлять не #pragma, которая должна обрабатываться на стадии препроцессирования, а __pragma, которая обрабатывается на стадии компиляции. #pragma в шаблоне должна срабатывать еще до того, как шаблон будет обработан компилятором, выводя текст "__FUNCSIG__", поскольку ни о каких сигнатурах препроцессор знать не должен.

Но еще лучше использовать нормальный макрос с __pragma (message ()), который будет выводить любой заданный текст, а не служебную информацию, к которой сбоку присобачена какая-то дополнительная.
Re[3]: Распечатать compile-time константу в выводе компилято
От: rg45 СССР  
Дата: 08.02.23 12:24
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:


ЕМ>Если уж использовать шаблон, в него нужно вставлять не #pragma, которая должна обрабатываться на стадии препроцессирования, а __pragma, которая обрабатывается на стадии компиляции.


О, снова новости из параллельной реальности. __pragma от #pragma отличается только тем, что ее можно использовать внутри макроопределений и то, что это microsoft specific keyword. И все, больше ни чем. Ни о каких обработках на стадии компиляции речи нигде не идет.

https://learn.microsoft.com/en-us/cpp/preprocessor/pragma-directives-and-the-pragma-keyword?view=msvc-170

Pragma directives specify machine-specific or operating system-specific compiler features. A line that starts with #pragma specifies a pragma directive. The Microsoft-specific __pragma keyword enables you to code pragma directives within macro definitions. The standard _Pragma preprocessor operator, introduced in C99 and adopted by C++11, is similar.

--
Отредактировано 08.02.2023 12:29 rg45 . Предыдущая версия .
Re[4]: Распечатать compile-time константу в выводе компилято
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.02.23 12:56
Оценка:
Здравствуйте, rg45, Вы писали:

R>Ни о каких обработках на стадии компиляции речи нигде не идет.


Фишка в том, что #-конструкции являются директивами препроцессирования. И описанная конструкция работает исключительно в силу того, что в компилятор встроен костыль, обрабатывающий конкретно эту директиву на этапе раскрытия шаблона, а не на этапе препроцессирования. Я хотел это добавить, но забыл. И это, кстати, лишает программиста возможности вывести оттуда сообщение именно на этапе препроцессирования.

А __pragma добавлена не просто "для использования в макросах", а как раз для того, чтобы обрабатываться там, где макрос раскрывается, а не где он определяется.
Re[5]: Распечатать compile-time константу в выводе компилято
От: rg45 СССР  
Дата: 08.02.23 13:09
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:


ЕМ>Фишка в том, что #-конструкции являются директивами препроцессирования.


Ну ты для меня прямо Луну открыл, и Солнце заодно.

ЕМ>А __pragma добавлена не просто "для использования в макросах", а как раз для того, чтобы обрабатываться там, где макрос раскрывается, а не где он определяется.


Да что ты говоришь? И как из этого можно сделать вывод об "обработке на стадии компиляции"?

А цитату в моем сообщении, в которой я жирным выделил "__pragma keyword enables you to code pragma directives" ты не заметил, конечно. Ну, это многое объясняет.
--
Отредактировано 08.02.2023 13:12 rg45 . Предыдущая версия . Еще …
Отредактировано 08.02.2023 13:11 rg45 . Предыдущая версия .
Re[6]: Распечатать compile-time константу в выводе компилято
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.02.23 13:48
Оценка:
Здравствуйте, rg45, Вы писали:

R>И как из этого можно сделать вывод об "обработке на стадии компиляции"?


Если немного подумать, то можно. Если думать в основном о том, как ловчее уязвить оппонента — трудно, да.
Re[7]: Распечатать compile-time константу в выводе компилято
От: rg45 СССР  
Дата: 08.02.23 13:50
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

R>>И как из этого можно сделать вывод об "обработке на стадии компиляции"?


ЕМ>Если немного подумать, то можно.


По-моему это возможно только при одном условии — если во время чтения вообще не включать мозги.

ЕМ>Если думать в основном о том, как ловчее уязвить оппонента — трудно, да.


А что еще можно делать с "оппонентом", который перманентно генерит какую-то бредятину?
--
Re[3]: Распечатать compile-time константу в выводе компилято
От: ботаныч Интернет https://youtu.be/I3lhN5CUP2M
Дата: 09.02.23 06:58
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Это очень кривой прием.

но вьіводит и без генерации ошибки. да джисях єто достигается используюется генерацией всяких ворнингов, анюзед к примеру.

В C/C++ многие простые и очевидные вещи приходится делать через задницу, ибо разработчики языка до таких мелочей не снисходят, они заняты высоким и утонченным.

похоже кому-то надо определяться, 1. с тем все ли только через генерацию ошибки, 2. и как оно относится друг к другу очень кривой прием и через задницу

static_print интереснее, когда он есть
Отредактировано 10.02.2023 14:41 ботаныч . Предыдущая версия .
Re[4]: Распечатать compile-time константу в выводе компилятора
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 09.02.23 09:29
Оценка: :)
Здравствуйте, ботаныч, Вы писали:

Б>похоже кому-то надо определяться


Так я-то давно определился, и объяснил, как это правильно делать в VC++.
Re[5]: Распечатать compile-time константу в выводе компилятора
От: ботаныч Интернет https://youtu.be/I3lhN5CUP2M
Дата: 10.02.23 13:05
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, ботаныч, Вы писали:


Б>>похоже кому-то надо определяться


ЕМ>Так я-то давно определился, и объяснил, как это правильно делать в VC++.

в данном случае правильно, для практика имеет одно значение — передать условно STATIC_PRINT(std::true_type) и увидеть std::integral_constant<bool ... предложенній вариант позваляет єто сделть мгновенно в любом проекте любой его части за секундьі. Большего для диагностической части подобного масштаба лично мной не ожидается.

если Вьі определились, то замечатльно, можно бьіло поделиться, вот прямо replace линк вместо єто очень криво. дать ссьілку.
Re[6]: Распечатать compile-time константу в выводе компилятора
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.02.23 13:21
Оценка:
Здравствуйте, ботаныч, Вы писали:

Б>можно бьіло поделиться, вот прямо replace линк вместо єто очень криво. дать ссьілку.


Я вам дал объяснение. Одного объяснения, без ссылки, не осилите?
Re[7]: Распечатать compile-time константу в выводе компилятора
От: ботаныч Интернет https://youtu.be/I3lhN5CUP2M
Дата: 10.02.23 13:53
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, ботаныч, Вы писали:


Б>>можно бьіло поделиться, вот прямо replace линк вместо єто очень криво. дать ссьілку.


ЕМ>Я вам дал объяснение. Одного объяснения, без ссылки, не осилите?

зачем?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.