2012-04-19 9 views
0

我需要用数千个分组显示一些数字(在这种情况下,使用句点作为分隔符)。所以,我使用printf标志'来实现这样的事情。使用ICC和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 

所以我的问题是:

  1. 该警告如何被抑制?
  2. 使用'作为flagf与printf和朋友,使用icc编译器安全吗?

UPDATE

我刚刚意识到,一个奇怪的伎俩打压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); 
} 

UPDATE

因为使用单引号与printf是一个XSI扩展(如@戴夫说),为了使代码更容易移植可能更有用遵循从C-FAQ, question 12.11建议,并利用其执行commaprint

+0

gcc是否抱怨? – 2012-04-19 18:53:54

+0

命令行上的'-wd269'是否禁用警告? – HostileFork 2012-04-19 19:09:11

+0

@PaulR:'gcc'不会抱怨,即使用'-Wall'编译。 – 2012-04-19 19:24:53

回答

3

要回答你的第二个问题,编译器实际上不控制你的格式字符串的处理;这是你的C库的工作。 icc无法识别格式字符串,因为它是非标准的,但只要您知道您的代码只会在c库支持'标志的平台上有效,那么您就可以。

由于opengroup page显示,'是一个XSI扩展,因此您的代码可以在任何符合XSI的平台上工作。