2012-04-19 29 views
0

千単位のグループ化(この場合は区切り記号としてピリオドを使用)で数字を表示する必要があります。だから、私はそのようなことを達成するためにprintfフラグ'を使用しています。数が実際にあるという事実にもかかわらず、不正な形式の文字列変換千単位の書式(アポストロフィ)のICCとprintfを使用した警告

警告#269:gccすべてがうまく行くが、私はiccを使用している場合、その後、私はこの警告を取得して

所望のフォーマットで印刷される。例えば

私たちは、この単純なプログラムコンパイルすると、:

% ./simple 
12345678   12.345.678 
987654321  987.654.321 

:すべてが期待どおりに機能しているにもかかわらず

% 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); 
             ^

#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); 
} 

をし、我々はこの警告を取得だから私の質問は:

  1. この警告はどのようにして抑制できますか?
  2. iccコンパイラを使用して、printfやフレンドにフラグとして'を使用しても安全ですか?

UPDATE

#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); 
} 

私はちょうど269警告を抑制するために奇妙なトリックが形式で変数を定義し、printfにその変数を渡していることに気づきました


更新

printfでアポストロフィを使用すると、コードをよりポータブルにするためにC-FAQ, question 12.11からの勧告に従い、commaprintのそれらの実装を使用することがより有用であるかもしれない、XSI拡張(@Daveによって記載されるように)であるので。

+0

gccは文句を言うのですか? –

+0

コマンドラインで '-wd269'は警告を無効にしますか? – HostileFork

+0

@PaulR: 'gcc'は' -Wall'でコンパイルしても不平を言っていません。 –

答えて

3

2番目の質問に答えるために、コンパイラは実際には書式文字列の処理を制御しません。それがあなたのCライブラリの仕事です。 iccは標準ではないためフォーマット文字列を認識しませんが、Cライブラリが'フラグをサポートしているプラ​​ットフォームでのみコードが有効であることを理解している限り、問題ありません。

opengroup pageが示すように、'はXSI拡張です。したがって、あなたのコードはすべてのXSI準拠プラットフォームで動作します。

関連する問題