数千のグループでいくつかの数値を表示する必要があります(この場合、区切り文字としてピリオドを使用します)。だから、私はその'
ようなことを達成するためにprintfフラグを使用しています。
gcc
すべてがうまくいきますが、を使用するとicc
、次の警告が表示されます。
警告#269:無効なフォーマット文字列変換
番号が実際に希望の形式で印刷されているという事実にもかかわらず。
たとえば、この単純なプログラムをコンパイルすると、次のようになります。
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main(int argc, char *argv[]) {
setlocale(LC_NUMERIC, "da_DK");
int i = 12345678;
unsigned long int j = 987654321;
printf("%d \t %'d \n%lu \t %'lu \n", i, i, j, j);
}
次に、この警告が表示されます。
% icc -o simple simple.c
simple.c(10): warning #269: invalid format string conversion
printf("%d \t %'d \n%lu \t %'lu \n", i, i, j, j);
^
すべてが期待どおりに機能するという事実にもかかわらず:
% ./simple
12345678 12.345.678
987654321 987.654.321
だから私の質問は:
- この警告をどのように抑制できますか?
- コンパイラを使用
'
して、printfやその仲間と一緒にフラグとして使用しても安全ですか?icc
更新:
269
警告を抑制するための奇妙なトリックは、フォーマットを使用して変数を定義し、その変数をprintf
:に渡すことであることに気づきました。
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main(int argc, char *argv[]) {
setlocale(LC_NUMERIC, "da_DK");
int i = 12345678;
unsigned long int j = 987654321;
const char *strFormat = "%d \t %'d \n%lu \t %'lu \n";
printf(strFormat, i, i, j, j);
}
更新:
でアポストロフィを使用するprintf
のはXSI拡張機能であるため(@Daveで述べられているように)、コードの移植性を高めるには、C-FAQの質問12.11の推奨事項に従い、の実装を使用する方が便利な場合がありcommaprint
ます。