Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 Совмещение constexpr и обычной функции  [new]
petrav
Member

Откуда:
Сообщений: 2075
Вот такая функция вычисляет длину строки на этапе компиляции:

inline constexpr
size_t c_strlen(char const *const start) noexcept
{
    char const *end = start;
    while (*end++ != '\0');
    return end - start - 1;
}


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

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) на этапе компиляции. Статья тут. И я понять не могу как он это делает? Правда в его примерах все параметры его печати константные. Ну так тогда это почти бесполезная фигня.
25 апр 20, 14:42    [22122623]     Ответить | Цитировать Сообщить модератору
 Re: Совмещение constexpr и обычной функции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

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

Posted via ActualForum NNTP Server 1.5

25 апр 20, 18:06    [22122729]     Ответить | Цитировать Сообщить модератору
 Re: Совмещение constexpr и обычной функции  [new]
petrav
Member

Откуда:
Сообщений: 2075
Dimitry Sibiryakov

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

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

double const ddd = getValue();
char buff[128] = {};
std::sprintf(buff, "%10.3f", ddd);

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

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

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

void print(char const *frmt, int aaa)
{
    std::printf(frmt, aaa);
}

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

Конечно, проще переписать это на `boost::format`, но это не хардкорно. :)
25 апр 20, 18:37    [22122734]     Ответить | Цитировать Сообщить модератору
 Re: Совмещение constexpr и обычной функции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

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

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

Posted via ActualForum NNTP Server 1.5

25 апр 20, 18:46    [22122736]     Ответить | Цитировать Сообщить модератору
 Re: Совмещение constexpr и обычной функции  [new]
petrav
Member

Откуда:
Сообщений: 2075
Конечно, в моём предыдущем примере функция `std::sprintf()` реализована примерно так:

template <size_t Size>
int sprintf(char (&buff)[Size], Bla-bla-bla...)
{
      // Bla-bla-bla...
}
25 апр 20, 18:50    [22122737]     Ответить | Цитировать Сообщить модератору
 Re: Совмещение constexpr и обычной функции  [new]
petrav
Member

Откуда:
Сообщений: 2075
Dimitry Sibiryakov

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

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

Можно привести код функции? Пустой, просто с таким атрибутом. И почему тут указаны 1, 2? А если будут другие типы? Нужно всё проверить. У меня в Студии не получилось такое откомпилировать. Хотя в статьях я находил такое.
25 апр 20, 18:57    [22122742]     Ответить | Цитировать Сообщить модератору
 Re: Совмещение constexpr и обычной функции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

Кого волнует какая-то студия?..
	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

25 апр 20, 19:05    [22122749]     Ответить | Цитировать Сообщить модератору
 Re: Совмещение constexpr и обычной функции  [new]
petrav
Member

Откуда:
Сообщений: 2075
Dimitry Sibiryakov

Кого волнует какая-то студия?..
	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)));`

Сообщение было отредактировано: 25 апр 20, 19:11
25 апр 20, 19:10    [22122753]     Ответить | Цитировать Сообщить модератору
 Re: Совмещение constexpr и обычной функции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

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

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

Posted via ActualForum NNTP Server 1.5

25 апр 20, 19:19    [22122760]     Ответить | Цитировать Сообщить модератору
 Re: Совмещение constexpr и обычной функции  [new]
petrav
Member

Откуда:
Сообщений: 2075
Dimitry Sibiryakov

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

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

Вы не ответили на вопрос. Что будет если типы аргументов будут другими? Я не желаю читать документацию на не переносимые фишки GCC. Если Вы не желаете отвечать, то оно и к лучшему. Закончим разговор.
25 апр 20, 19:26    [22122763]     Ответить | Цитировать Сообщить модератору
 Re: Совмещение constexpr и обычной функции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

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

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

Posted via ActualForum NNTP Server 1.5

25 апр 20, 22:08    [22122841]     Ответить | Цитировать Сообщить модератору
 Re: Совмещение constexpr и обычной функции  [new]
petrav
Member

Откуда:
Сообщений: 2075
Dimitry Sibiryakov

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

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

Вы вырвали мою фразу из контекста и мои слова начали звучать по другому. Вот зачем Вы это сделали? Пожалейте и меня, и модератора. Лучше не отвечайте.
25 апр 20, 22:25    [22122848]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить