gpt4 book ai didi

c - 使用带有千位分组格式(撇号)的 ICC 和 printf 的警告

转载 作者:太空宇宙 更新时间:2023-11-04 07:34:26 26 4
gpt4 key购买 nike

我需要显示一些以千为单位的数字(在本例中,使用句点作为分隔符)。所以,我使用 printf 标志 ' 来实现这样的事情。

使用 gcc 一切顺利,但如果我使用 icc,则会收到此警告:

warning #269: invalid format string conversion

尽管该数字确实以所需格式打印。

例如,如果我们编译这个简单的程序:

#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. 使用 ' 作为 printf 和 friend 的标志,使用 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, question 12.11 的建议并使用它们的实现可能更有用commaprint 的。

最佳答案

要回答你的第二个问题,编译器实际上并不控制你的格式字符串的处理;那是你的 C 库的工作。 icc 不识别格式字符串,因为它是非标准的,但只要您了解您的代码仅在其 c 库支持 ' 标志的平台上有效,你会没事的。

作为opengroup page表明,' 是一个 XSI 扩展,因此您的代码可以在任何符合 XSI 的平台上运行。

关于c - 使用带有千位分组格式(撇号)的 ICC 和 printf 的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10234766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com