powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Совмещение constexpr и обычной функции
12 сообщений из 12, страница 1 из 1
Совмещение constexpr и обычной функции
    #39951346
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такая функция вычисляет длину строки на этапе компиляции:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
inline constexpr
size_t c_strlen(char const *const start) noexcept
{
    char const *end = start;
    while (*end++ != '\0');
    return end - start - 1;
}



Теперь я хочу написать обёртку вокруг printf() что бы на этапе компиляции проверялась длина строки:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
inline constexpr
size_t my_print(char const *const start) noexcept
{
    char const *end = start;
    while (*end++ != '\0');
    static_assert(end - start - 1 < BuffSize);

    std::printf("%s", start);
}



Пример надуманный. Конечно, он не компилируется. Можно это как-то решить без макросов? Что бы первая часть функции отрабатывала на этапе компиляции, а вторая при выполнении.

На самом деле я тут нашёл в инете статью о проверке строки формата (аля printf) на этапе компиляции. Статья тут . И я понять не могу как он это делает? Правда в его примерах все параметры его печати константные. Ну так тогда это почти бесполезная фигня.
...
Рейтинг: 0 / 0
Совмещение constexpr и обычной функции
    #39951402
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то проверка формата делается компилятором автоматически при включении опции
-Wformat, как и проверка на длину буфера начиная с версии 7.Х... Ты давай реальную задач,
не абстрактную.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Совмещение constexpr и обычной функции
    #39951407
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Вообще-то проверка формата делается компилятором автоматически при включении опции
-Wformat, как и проверка на длину буфера начиная с версии 7.Х... Ты давай реальную задач,
не абстрактную.

Visual Studio, конечно, тоже выдаёт такие предупреждения про несоответствие формата и аргументов. Длину буфера, конечно же, на этапе компиляции проверить невозможно.

Код: plaintext
1.
2.
3.
double const ddd = getValue();
char buff[128] = {};
std::sprintf(buff, "%10.3f", ddd);


Размера буфера точно хватит? Как думаете?

Но это было бы слишком просто. Дело в том, что уже написаны обёртки вокруг `sprintf()` и они написаны не просто так. Они реально нужны. Внутри они реализованы через `vsprintf()` или как-то так. И в таком случае предупреждения даже от современных компиляторов перестают работать.

Вот тут предупреждения не дождёшься:

Код: plaintext
1.
2.
3.
4.
void print(char const *frmt, int aaa)
{
    std::printf(frmt, aaa);
}


Вот эту проблему и нужно решить.

Конечно, проще переписать это на `boost::format`, но это не хардкорно. :)
...
Рейтинг: 0 / 0
Совмещение constexpr и обычной функции
    #39951408
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravВот эту проблему и нужно решить.

Эта проблема решается через "__attribute__((format(gnu_printf, 1, 2)));" при декларации.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Совмещение constexpr и обычной функции
    #39951409
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, в моём предыдущем примере функция `std::sprintf()` реализована примерно так:

Код: plaintext
1.
2.
3.
4.
5.
template <size_t Size>
int sprintf(char (&buff)[Size], Bla-bla-bla...)
{
      // Bla-bla-bla...
}
...
Рейтинг: 0 / 0
Совмещение constexpr и обычной функции
    #39951413
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravВот эту проблему и нужно решить.

Эта проблема решается через "__attribute__((format(gnu_printf, 1, 2)));" при декларации.

Можно привести код функции? Пустой, просто с таким атрибутом. И почему тут указаны 1, 2? А если будут другие типы? Нужно всё проверить. У меня в Студии не получилось такое откомпилировать. Хотя в статьях я находил такое.
...
Рейтинг: 0 / 0
Совмещение constexpr и обычной функции
    #39951418
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кого волнует какая-то студия?..
Код: sql
1.
2.
3.
4.
	inline void Write(const char* const, ...) __attribute__((format(gnu_printf, 1, 2)));
	inline void Write(const char* const, ...)
	{
	}


Это реальный кусок заголовка реального проекта.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Совмещение constexpr и обычной функции
    #39951422
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Кого волнует какая-то студия?..
Код: sql
1.
2.
3.
4.
	inline void Write(const char* const, ...) __attribute__((format(gnu_printf, 1, 2)));
	inline void Write(const char* const, ...)
	{
	}


Это реальный кусок заголовка реального проекта.


:) Весь мир волнует какая-то студия. Почему в Вашем коде явно указаны какие-то 1 и 2? Откуда они взялись? А если типы будут другие? Например `__attribute__((format(gnu_printf, "1", 2.3f)));`
...
Рейтинг: 0 / 0
Совмещение constexpr и обычной функции
    #39951429
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravОткуда они взялись?

Из документации к данному атрибуту, естественно. Весьма рекомендую.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Совмещение constexpr и обычной функции
    #39951432
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravОткуда они взялись?

Из документации к данному атрибуту, естественно. Весьма рекомендую.

Вы не ответили на вопрос. Что будет если типы аргументов будут другими? Я не желаю читать документацию на не переносимые фишки GCC. Если Вы не желаете отвечать, то оно и к лучшему. Закончим разговор.
...
Рейтинг: 0 / 0
Совмещение constexpr и обычной функции
    #39951502
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravЯ не желаю читать документацию

Ну как хотите.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Совмещение constexpr и обычной функции
    #39951508
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravЯ не желаю читать документацию

Ну как хотите.

Вы вырвали мою фразу из контекста и мои слова начали звучать по другому. Вот зачем Вы это сделали? Пожалейте и меня, и модератора. Лучше не отвечайте.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Совмещение constexpr и обычной функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]