GCC中的PRIuPTR预处理程序错误?

时间:2014-10-03 15:48:44

标签: c++ gcc printf

以下程序,当使用GCC 4.8.1编译为C ++时

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>

int main() {
    uintptr_t i = 0;
    i--;
    printf("%" PRIuPTR "\n", i);
    return 0;
}

给出以下错误消息

a.cc: In function 'int main()':
a.cc:8:13: error: expected ')' before 'PRIuPTR'
  printf("%" PRIuPTR "\n", i);
             ^

它使用Microsoft编译器进行编译和运行,甚至在编译为C时使用GCC。

我错过了什么,或者这是GCC中的错误?如果是后者,是否有解决方法?

1 个答案:

答案 0 :(得分:3)

C标准说这包含了来自C ++的C头:

  

只有在定义__STDC_FORMAT_MACROS时,C ++实现才应定义这些宏   在包含<inttypes.h>之前。

似乎GCC遵循这一建议,而微软则没有。

更好的解决方案是使用C ++标头<cinttypes>,它无条件地定义这些宏,而不是定义此宏并包含不推荐使用的C标头。 (如评论中所述,C ++标准明确指出宏对C ++标题没有影响。)

或者,当有更方便(和类型安全)的C ++替代方案std::cout << i;

时,请停止使用C库。