Как я могу использовать _stprintf в своих программах с поддержкой UNICODE и без нее?

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

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

Ответов (3)

Решение

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

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

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

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

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

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

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

Кто-то пошутил?

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

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

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