【发布时间】:2012-05-01 08:41:54
【问题描述】:
我需要以千位分组显示一些数字(在这种情况下,使用句点作为分隔符)。所以,我使用 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
所以我的问题是:
- 如何抑制此警告?
- 通过
icc编译器将'用作printf 和朋友的标志是否安全?
更新:
我刚刚意识到抑制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, question 12.11 的建议并使用他们的@987654334 实现可能更有用@。
【问题讨论】:
-
命令行中的
-wd269是否禁用警告? -
@PaulR:
gcc没有抱怨,甚至使用-Wall编译。 -
@HostileFork:是的,使用该选项,警告将被禁用,但它也会禁用与代码 269 有关的任何其他错误或问题。
-
恰好看到一个邮件列表说这不起作用:
#pragma warning ( push )、#pragma warning ( disable: 269 )、[违规代码]、#pragma warning( pop )...但是命令行开关确实如此。 :-/
标签: c locale printf number-formatting icc