Как я могу использовать _stprintf в своих программах с поддержкой UNICODE и без нее? - PullRequest
4 голосов
/ 27 февраля 2009

Microsoft определяет _stprintf как swprintf, если определено _UNICODE, и sprintf, если нет. Но эти функции принимают разные аргументы! В swprintf вторым аргументом является размер буфера, но sprintf этого не имеет.

Кто-то дурак? Если это так, это большой. Как я могу использовать _stprintf в своих программах и заставить их работать с _UNICODE и без него?

Ответы [ 3 ]

5 голосов
/ 27 февраля 2009

Вы видите параллельную эволюцию здесь. swprintf является опозданием к стандарту C, после того как было обнаружено, что (A) 8 битов недостаточно для текста и (B) вы должны передать размеры буфера вместе с буферами. TCHAR - это идея Microsoft об унификации API-интерфейсов ASCII и Unicode. Они упали мяч, пропуская точку (B). Правильное решение TCHAR должно было бы определить _stprintf как swprintf или snprintf.

Решение состоит в том, чтобы просто обернуть <tchar.h> и сделать это самостоятельно.

1 голос
/ 27 февраля 2009

эти функции принимают разные аргументы!

Для компиляторов MS доступны две разные версии. Взгляните здесь . Это соответствует стандарту ANSI. Но я думаю, что это не отвечает на ваш вопрос. Я пропущу это некоторое время и скорее расскажу, как можно добиться единообразия.

они работают с _UNICODE и без него?

Вам лучше использовать «безопасные строковые функции» согласно рекомендациям MS. Смотрите это . Используйте `_stprintf_s ', и я думаю, что вы обойдете свою проблему.

Кто-то дурак?

РЕДАКТИРОВАНИЕ: Я так не думаю. У меня нет под рукой Обоснования, чтобы дать вам ответ. Я опубликую обновление, когда получу в руки что-то более конкретное. А пока посмотрим на объяснение М.С.альтерса.

Любопытно, что среда выполнения MS C не не претендует на совместимость со стандартом ISO.

Отказ от ответственности: я не защищаю гиганта Редмонда, а только указываю на вещи, которые кажутся мне странными!

0 голосов
/ 16 февраля 2016

Возможно, это не прямой ответ на вопрос, но одна альтернатива - использовать _stprintf_s. Вы должны добавить дополнительный параметр parm, но тогда он все равно будет компилироваться в обоих направлениях и будет более перспективным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...