символ спецификации размера mingw printf h - PullRequest
1 голос
/ 18 июля 2011

Visual Studio имеет таблицу спецификаций размера и расстояния , которая говорит, что я могу сделать что-то подобное, используя префикс h для указания однобайтовой строки символов независимо от printf или wprintf:

int main()
{
char test[]= "abc";
_tprintf(_T("%hs\n"),test);
}


Но если я скомпилирую то же самое с помощью mingw gcc и -Wall, я получу следующее предупреждение:
warning: format '%hs' expects type 'short int *', but argument 2 has type 'char *'

Является ли то, что я делаю, приемлемым способом для указания однобайтовой символьной строки в mingw?

Спасибо

Редактировать-Ответ на этот вопрос дан ниже достаточно подробно. Краткий ответ - да, это приемлемый способ указать однобайтовую строку символов в mingw, и предупреждение можно игнорировать.

1 Ответ

2 голосов
/ 18 июля 2011

Вы также заметите, что в документах по Visual Studio написано:

Примечание. Префиксы h и l являются расширениями Microsoft при использовании с данными типа char.

Я думаю, что было бы точнее сказать "при использовании со спецификаторами формата 'c' или 's' (верхний или нижний регистр)".

Поймите, что компилятор GCC действительно не знает о том, как среда выполнения Microsoft работает со строками формата printf(), и предупреждение, которое выдает GCC, адаптировано к средам выполнения, которые он более обычно использует. При сборке с MinGW используется среда выполнения Microsoft C, предоставляемая с Windows, msvcrt.dll (хотя MinGW предоставляет замены или обертки для некоторых библиотечных функций). Поэтому иногда возникает путаница между тем, что компилятор считает приемлемым для строки формата printf(), и аргументами, предоставленными printf(), и тем, что на самом деле будет делать среда выполнения.

Например, до недавнего времени использование ll для целочисленного преобразования для форматирования 64-битного типа int не работало правильно в MinGW. Я не уверен, исправлено ли это в функциях поддержки MinGW или msvcrt.dll было обновлено для поддержки модификатора ll (подозреваю, что msvcrt.dll было обновлено - мне придется проверить .. .). * * тысяча двадцать-один

В любом случае, все сводится к тому, что независимо от предупреждений, которые GCC выдает о строке формата printf(), по всей вероятности, вам нужно будет использовать документы MSVC для строк формата, поскольку среда выполнения MS это MinGW буду использовать. Если вам не нравится генерируемый warngin, вы можете рассмотреть возможность добавления опции -Wno-format в ваш скрипт сборки MinGW.

...