以下程序,当使用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中的错误?如果是后者,是否有解决方法?
答案 0 :(得分:3)
C标准说这包含了来自C ++的C头:
似乎GCC遵循这一建议,而微软则没有。只有在定义
__STDC_FORMAT_MACROS
时,C ++实现才应定义这些宏 在包含<inttypes.h>
之前。
更好的解决方案是使用C ++标头<cinttypes>
,它无条件地定义这些宏,而不是定义此宏并包含不推荐使用的C标头。 (如评论中所述,C ++标准明确指出宏对C ++标题没有影响。)
或者,当有更方便(和类型安全)的C ++替代方案std::cout << i;