我需要显示一些数以千计的分组(在这种情况下,使用句点作为分隔符)。所以,我使用 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);
}
更新:
因为使用撇号 withprintf
是 XSI 扩展(如@Dave 所述),为了使代码更具可移植性,遵循C-FAQ 问题 12.11中的建议并使用他们的commaprint
.