2009-02-27 1 views
4

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

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

+0

В ретроспективе лучше отказаться от версий, отличных от Unicode. tchar.h уже давно пережил свою полезность. –

ответ

5

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

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

1

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

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

У них есть работа с и без _UNICODE?

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

Был ли кто-то сентиментальным?

EDITED: Я так не считаю. У меня нет достаточного обоснования, чтобы дать вам ответ. Я опубликую обновление, когда я получу что-то более конкретное. Тем временем взгляните на объяснения MSalters.

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

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

+0

Нет смысла утверждать, что, поскольку стандарт ANSI C является переупакованным стандартом ISO C.Microsoft не является членом ISO; они являются членами ANSI. (INCITS сегодня), который, в свою очередь, является членом ISO. – MSalters

+0

@MSalters: Я не защищаю MS, только указывая, что меня поражает. – dirkgently

0

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

Смежные вопросы