Распечатать 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. А перевести число в строку па этапе комиляции вроде ж можно?
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://youtube.com/shorts/eapWB7W8hEE
Дата: 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 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.