K>Всегда использовал такую лабуду, чтобы напечатать константу в аутпуте компилятора:
K>Но мне кажется есть более простой вариант сделать это проще и сразу на месте, без объявления класса?
Мышку на ParameterToPrint наведи в VSCode+clangd))0)0
Re[4]: Распечатать compile-time константу в выводе компилятора
Здравствуйте, koenjihyakkei, Вы писали:
K>кажется есть более простой вариант сделать это проще и сразу на месте, без объявления класса?
В C/C++ многие простые и очевидные вещи приходится делать через задницу, ибо разработчики языка до таких мелочей не снисходят, они заняты высоким и утонченным.
Re: Распечатать compile-time константу в выводе компилятора
K>error: implicit instantiation of undefined template 'Foo<64>'
K>
K>Но мне кажется есть более простой вариант сделать это проще и сразу на месте, без объявления класса?
Можно использовать несоответствие типов формальных и фактических параметров, чтоб спровоцировать ошибку вида: "cannon convert 'A' to 'B'". Осталось только подобрать какую-нибудь функцию, желательно из стандартной библиотеки, чтоб не объявлять свои. Нарпимер printf:
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*'"
Здравствуйте, rg45, Вы писали:
R>Можно использовать несоответствие типов формальных и фактических параметров, чтоб спровоцировать ощибку
В том и задница, что все известные способы завязаны на создание ошибки — и, как следствие, невозможность завершить компиляцию. Если бы разработчики языка меньше думали о высоком и красивом, такие средства давно были бы включены в язык штатно, безо всяких провоцируемых ошибок.
Re[3]: Распечатать compile-time константу в выводе компилятора
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>В том и задница, что все известные способы завязаны на создание ошибки — и, как следствие, невозможность завершить компиляцию. Если бы разработчики языка меньше думали о высоком и красивом, такие средства давно были бы включены в язык штатно, безо всяких провоцируемых ошибок.
Как я понимаю, ты хочешь пригласить меня в очередную дискуссию о несовершенстве современного С/С++? Спасибо за приглашение, но я пропущу в этот раз.
--
Re: Распечатать compile-time константу в выводе компилятора
Здравствуйте, koenjihyakkei, Вы писали:
K>Всегда использовал такую лабуду, чтобы напечатать константу в аутпуте компилятора:
K>Но мне кажется есть более простой вариант сделать это проще и сразу на месте, без объявления класса?
на MSVC компиляторах есть
#pragma message (__FUNCSIG__) обычно заводится
и используется для компайл тайм дебага.
нечто подобное но с ворнингами (чаще "-Wuninitialized") делаеnся и в gcc, где выкладка от компайлера обычно глубже по стеку.
Re[2]: Распечатать compile-time константу в выводе компилятора
Это очень кривой прием. Если уж использовать шаблон, в него нужно вставлять не #pragma, которая должна обрабатываться на стадии препроцессирования, а __pragma, которая обрабатывается на стадии компиляции. #pragma в шаблоне должна срабатывать еще до того, как шаблон будет обработан компилятором, выводя текст "__FUNCSIG__", поскольку ни о каких сигнатурах препроцессор знать не должен.
Но еще лучше использовать нормальный макрос с __pragma (message ()), который будет выводить любой заданный текст, а не служебную информацию, к которой сбоку присобачена какая-то дополнительная.
Re[3]: Распечатать compile-time константу в выводе компилято
ЕМ>Если уж использовать шаблон, в него нужно вставлять не #pragma, которая должна обрабатываться на стадии препроцессирования, а __pragma, которая обрабатывается на стадии компиляции.
О, снова новости из параллельной реальности. __pragma от #pragma отличается только тем, что ее можно использовать внутри макроопределений и то, что это microsoft specific keyword. И все, больше ни чем. Ни о каких обработках на стадии компиляции речи нигде не идет.
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.
Здравствуйте, rg45, Вы писали:
R>Ни о каких обработках на стадии компиляции речи нигде не идет.
Фишка в том, что #-конструкции являются директивами препроцессирования. И описанная конструкция работает исключительно в силу того, что в компилятор встроен костыль, обрабатывающий конкретно эту директиву на этапе раскрытия шаблона, а не на этапе препроцессирования. Я хотел это добавить, но забыл. И это, кстати, лишает программиста возможности вывести оттуда сообщение именно на этапе препроцессирования.
А __pragma добавлена не просто "для использования в макросах", а как раз для того, чтобы обрабатываться там, где макрос раскрывается, а не где он определяется.
Re[5]: Распечатать compile-time константу в выводе компилято
ЕМ>Фишка в том, что #-конструкции являются директивами препроцессирования.
Ну ты для меня прямо Луну открыл, и Солнце заодно.
ЕМ>А __pragma добавлена не просто "для использования в макросах", а как раз для того, чтобы обрабатываться там, где макрос раскрывается, а не где он определяется.
Да что ты говоришь? И как из этого можно сделать вывод об "обработке на стадии компиляции"?
А цитату в моем сообщении, в которой я жирным выделил "__pragma keyword enables you to code pragma directives" ты не заметил, конечно. Ну, это многое объясняет.
Здравствуйте, Евгений Музыченко, Вы писали:
R>>И как из этого можно сделать вывод об "обработке на стадии компиляции"?
ЕМ>Если немного подумать, то можно.
По-моему это возможно только при одном условии — если во время чтения вообще не включать мозги.
ЕМ>Если думать в основном о том, как ловчее уязвить оппонента — трудно, да.
А что еще можно делать с "оппонентом", который перманентно генерит какую-то бредятину?
--
Re[3]: Распечатать compile-time константу в выводе компилято
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Это очень кривой прием.
но вьіводит и без генерации ошибки. да джисях єто достигается используюется генерацией всяких ворнингов, анюзед к примеру.
В C/C++ многие простые и очевидные вещи приходится делать через задницу, ибо разработчики языка до таких мелочей не снисходят, они заняты высоким и утонченным.
похоже кому-то надо определяться, 1. с тем все ли только через генерацию ошибки, 2. и как оно относится друг к другу очень кривой прием и через задницу
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, ботаныч, Вы писали:
Б>>похоже кому-то надо определяться
ЕМ>Так я-то давно определился, и объяснил, как это правильно делать в VC++.
в данном случае правильно, для практика имеет одно значение — передать условно STATIC_PRINT(std::true_type) и увидеть std::integral_constant<bool ... предложенній вариант позваляет єто сделть мгновенно в любом проекте любой его части за секундьі. Большего для диагностической части подобного масштаба лично мной не ожидается.
если Вьі определились, то замечатльно, можно бьіло поделиться, вот прямо replace линк вместо єто очень криво. дать ссьілку.
Re[6]: Распечатать compile-time константу в выводе компилятора
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, ботаныч, Вы писали:
Б>>можно бьіло поделиться, вот прямо replace линк вместо єто очень криво. дать ссьілку.
ЕМ>Я вам дал объяснение. Одного объяснения, без ссылки, не осилите?
зачем?