|
Совмещение constexpr и обычной функции
|
|||
---|---|---|---|
#18+
Вот такая функция вычисляет длину строки на этапе компиляции: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Теперь я хочу написать обёртку вокруг printf() что бы на этапе компиляции проверялась длина строки: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Пример надуманный. Конечно, он не компилируется. Можно это как-то решить без макросов? Что бы первая часть функции отрабатывала на этапе компиляции, а вторая при выполнении. На самом деле я тут нашёл в инете статью о проверке строки формата (аля printf) на этапе компиляции. Статья тут . И я понять не могу как он это делает? Правда в его примерах все параметры его печати константные. Ну так тогда это почти бесполезная фигня. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2020, 14:42 |
|
Совмещение constexpr и обычной функции
|
|||
---|---|---|---|
#18+
Вообще-то проверка формата делается компилятором автоматически при включении опции -Wformat, как и проверка на длину буфера начиная с версии 7.Х... Ты давай реальную задач, не абстрактную. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2020, 18:06 |
|
Совмещение constexpr и обычной функции
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Вообще-то проверка формата делается компилятором автоматически при включении опции -Wformat, как и проверка на длину буфера начиная с версии 7.Х... Ты давай реальную задач, не абстрактную. Visual Studio, конечно, тоже выдаёт такие предупреждения про несоответствие формата и аргументов. Длину буфера, конечно же, на этапе компиляции проверить невозможно. Код: plaintext 1. 2. 3.
Размера буфера точно хватит? Как думаете? Но это было бы слишком просто. Дело в том, что уже написаны обёртки вокруг `sprintf()` и они написаны не просто так. Они реально нужны. Внутри они реализованы через `vsprintf()` или как-то так. И в таком случае предупреждения даже от современных компиляторов перестают работать. Вот тут предупреждения не дождёшься: Код: plaintext 1. 2. 3. 4.
Вот эту проблему и нужно решить. Конечно, проще переписать это на `boost::format`, но это не хардкорно. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2020, 18:37 |
|
Совмещение constexpr и обычной функции
|
|||
---|---|---|---|
#18+
petravВот эту проблему и нужно решить. Эта проблема решается через "__attribute__((format(gnu_printf, 1, 2)));" при декларации. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2020, 18:46 |
|
Совмещение constexpr и обычной функции
|
|||
---|---|---|---|
#18+
Конечно, в моём предыдущем примере функция `std::sprintf()` реализована примерно так: Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2020, 18:50 |
|
Совмещение constexpr и обычной функции
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravВот эту проблему и нужно решить. Эта проблема решается через "__attribute__((format(gnu_printf, 1, 2)));" при декларации. Можно привести код функции? Пустой, просто с таким атрибутом. И почему тут указаны 1, 2? А если будут другие типы? Нужно всё проверить. У меня в Студии не получилось такое откомпилировать. Хотя в статьях я находил такое. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2020, 18:57 |
|
Совмещение constexpr и обычной функции
|
|||
---|---|---|---|
#18+
Кого волнует какая-то студия?.. Код: sql 1. 2. 3. 4.
Это реальный кусок заголовка реального проекта. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2020, 19:05 |
|
Совмещение constexpr и обычной функции
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Кого волнует какая-то студия?.. Код: sql 1. 2. 3. 4.
Это реальный кусок заголовка реального проекта. :) Весь мир волнует какая-то студия. Почему в Вашем коде явно указаны какие-то 1 и 2? Откуда они взялись? А если типы будут другие? Например `__attribute__((format(gnu_printf, "1", 2.3f)));` ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2020, 19:10 |
|
Совмещение constexpr и обычной функции
|
|||
---|---|---|---|
#18+
petravОткуда они взялись? Из документации к данному атрибуту, естественно. Весьма рекомендую. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2020, 19:19 |
|
Совмещение constexpr и обычной функции
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravОткуда они взялись? Из документации к данному атрибуту, естественно. Весьма рекомендую. Вы не ответили на вопрос. Что будет если типы аргументов будут другими? Я не желаю читать документацию на не переносимые фишки GCC. Если Вы не желаете отвечать, то оно и к лучшему. Закончим разговор. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2020, 19:26 |
|
Совмещение constexpr и обычной функции
|
|||
---|---|---|---|
#18+
petravЯ не желаю читать документацию Ну как хотите. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2020, 22:08 |
|
Совмещение constexpr и обычной функции
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravЯ не желаю читать документацию Ну как хотите. Вы вырвали мою фразу из контекста и мои слова начали звучать по другому. Вот зачем Вы это сделали? Пожалейте и меня, и модератора. Лучше не отвечайте. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2020, 22:25 |
|
|
start [/forum/topic.php?fid=57&msg=39951408&tid=2017443]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 127ms |
0 / 0 |