【问题标题】:How to fix warning with %ms in scanf如何在 scanf 中使用 %ms 修复警告
【发布时间】:2017-11-14 23:23:25
【问题描述】:

我需要这样做:

scanf("%ms", ...)

并用

编译它
g++ -Wall -pedantic -std=c++11 

还有

gcc -Wall -pedantic -std=c99

它会打印警告:ISO C 不支持 'm' scanf 标志。 我该如何解决?

【问题讨论】:

  • 您想使用 C++ 还是 C?在 C++ 中,您应该只使用 std::string
  • 这在man 3 scanf"NOTES" 部分中有详细说明。分配的am 都是非标准扩展。它们需要一个指向char的指针,而不是指向char的指针作为变量参数。
  • 解决这个问题的唯一方法是在 ISO C 标准委员会工作,让修饰符成为标准 C 的一部分(这仍然不会使它在 C99 或 C11 中有效——那个特别机会已经飞逝,除非你手边有一台时间机器)。请注意,并非所有 POSIX 系统都支持它;具体来说,例如,直到并包括 High Sierra 10.13 的 macOS 不支持它。这是一个非常有用的功能,它被支持;并非所有地方都支持它。因此,您必须为不可用的系统设计一种解决方法,即使您想在可用的地方使用它。
  • 什么是“解决”您的问题?不更改对scanf() 的呼叫但抑制警告?更改代码以便不会因为调用不同的函数而生成警告?您打算只使用 GCC 还是必须使用其他编译器?

标签: c


【解决方案1】:

答案:要么放弃-pedantic,要么放弃%ms。他们没有走到一起。

AFAIK,在 ISO C 标准中没有像 %ms 这样的格式说明符。它是由 POSIX 作为扩展添加的。

命令行参数 -pedantic 告诉 GCC 严格遵循 ISO C 标准,因此它不会接受带有该选项的 %ms

如果您的程序以 POSIX 系统为目标,您可以删除 -pedantic。否则,如果您想让您的代码可移植,请不要在 printf/scanf 中使用 %ms

【讨论】:

    【解决方案2】:

    %ms 格式由 POSIX 指定,而不是由 ISO C 指定。

    通过使用-Wall -pedantic -std=c99,您已请求对违反 C99 标准的代码进行诊断,正如您所做的那样(其行为未定义)。

    如果您希望您的代码可移植到 ISO C99(或 C11)实现,请不要使用 %ms

    如果您需要使用%ms(降低您的代码的可移植性,但它应该适用于任何符合 POSIX 的实现),请不要使用这些选项。删除 -pedantic 选项似乎足以抑制警告。 gcc 以外的编译器可能有不同的选择来实现这一点(尽管 clang 非常接近地复制 gcc)。

    【讨论】:

      【解决方案3】:

      与标准 C 版本的 scanf() 相比,%ms 表示法是 scanf() 中的 POSIX 扩展

      【讨论】:

      • 虽然该陈述是准确的(就目前而言),但我认为它不能回答问题。
      • POSIX scanf() 规范表明这是一个扩展:它包括行“• [CX] ⌦ 一个可选的分配分配字符 'm'。⌫” 并且还解释了它的作用(也标有“[CX]”——C 扩展——符号)。
      猜你喜欢
      • 2021-05-11
      • 2018-05-10
      • 2019-08-08
      • 2020-11-28
      • 2017-10-25
      • 2017-07-03
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      相关资源
      最近更新 更多