1

Visual Studio には、printf または wprintf に関係なく、h プレフィックスを使用して 1 バイト文字列を指定すると、次のようなことができるという サイズと距離の仕様表があります。

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 で 1 バイト文字列を指定するために受け入れられる方法ですか?

ありがとう

編集-この質問は、以下でかなり詳細に回答されています。簡単な答えは「はい」です。これは mingw で 1 バイト文字列を指定するための受け入れ可能な方法であり、警告は無視できます。

4

1 に答える 1

2

VisualStudioのドキュメントには次のように書かれていることにも注意してください。

注:hおよびlプレフィックスは、char型のデータで使用される場合のMicrosoft拡張機能です。

'c'これは、「または's'フォーマット指定子(大文字または小文字)と一緒に使用した場合」と言う方が正確だと思います。

GCCコンパイラは、Microsoftのランタイムがprintf()フォーマット文字列をどのように処理するかを実際には知らず、GCCが発する警告は、より通常使用するランタイムに合わせて調整されていることを理解してください。MinGWを使用してビルドする場合、Windowsで提供されるMicrosoft Cランタイムmsvcrt.dllが使用されます(ただし、MinGWは一部のライブラリ関数の置換またはラッパーを提供します)。そのため、コンパイラがprintf()フォーマット文字列に対して問題ないと考えることと、提供される引数printf()と、ランタイムが実際に実行することとの間に混乱が生じることがあります。

たとえば、最近までll、整数変換を使用して64ビットのint型をフォーマットすることは、MinGWでは正しく機能しませんでした。その「修正」がMinGWサポート関数で発生したのか、それとも修飾子msvcrt.dllをサポートするように更新されたのかはわかりませんll(更新されたと思わmsvcrt.dllれます-確認する必要があります...)。

とにかく、これは要約すると、GCCがフォーマット文字列について与える警告に関係なく、printf()MinGWが使用するMSランタイムであるため、フォーマット文字列にはおそらくMSVCドキュメントを使用する必要があります。警告が生成されるのが気に入らない場合は-Wno-format、MinGWビルドスクリプトにオプションを追加することを検討してください。

于 2011-07-18T06:47:46.573 に答える