【问题标题】:gcc Stringification of expression with "%" sign带有“%”符号的表达式的 gcc 字符串化
【发布时间】:2018-06-27 12:22:56
【问题描述】:

我正在尝试编译以下程序

#include <stdio.h>

#define __stringify_1(x...) #x
#define __stringify(x...)   __stringify_1(x)

#define FOO(expression)\
printf("prefix" __stringify(expression))

int main(int argc, char **argv)
{
   FOO(10 % 4); // <-- This is a problematic one 
   FOO(10 == 4); 
}

这会在编译时发出警告: 警告:转换在格式末尾缺少类型 [-Wformat=]

这个警告的原因是表达式实际上被扩展为 printf("prefix" "10 % 4"),因此编译器需要一个“格式化程序”。是否有任何解决方案可以将此类表达式传递给宏而不会收到警告?

谢谢

【问题讨论】:

  • 如果您不想格式化,请使用puts
  • %% 用于%
  • @mat 或 fputs() 以防字符串末尾不需要换行符。

标签: c gcc preprocessor stringification


【解决方案1】:

使用printf("prefix%s", __stringify(expression)) 禁用expression 的格式影响。

【讨论】:

    【解决方案2】:

    来自printf

    一个 % 后跟另一个 % 字符将向流中写入一个 %。

    所以,试试双%%,像这样:

    FOO(10 %% 4);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 2023-03-27
      • 2020-06-03
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      相关资源
      最近更新 更多