如果添加了第4行中的include语句(未注释),则会导致编译器警告。
编译器:gcc version 8.1.0 (i686-win32-dwarf-rev0,由MinGW-W64项目构建)
#define __STDC_FORMAT_MACROS
// Adding this and -Wall results in compiler warning
//#include "stdio.h"
#include <cstdint>
#include <cinttypes>
#include <cstdio>
int main()
{
int64_t i = 0;
printf("%" PRId64, i);
}
警告如下:
testlld.cpp:11:14: warning: unknown conversion type character 'l' in format [-Wformat=]
std::printf("%" PRId64, i);
^
testlld.cpp:11:14: warning: too many arguments for format [-Wformat-extra-args]
testlld.cpp:11:14: warning: unknown conversion type character 'l' in format [-Wformat=]
testlld.cpp:11:14: warning: too many arguments for format [-Wformat-extra-args]
有人能解释一下发生了什么吗?
当然,我可以通过只使用来解决这个问题,在这种情况下,这是正确的。但这又引出了另一个问题…
假设我有一个头文件,它包含两个实现文件-一个用C编译器编译,另一个用c++编译器编译。头文件需要使用"stdio.h"因为它需要用C编译器编译。这是否意味着包括头文件在内的所有代码也必须使用"stdio.h"和NOT
这似乎是一个已知的错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60434
这是有意义的,因为-尽管有警告- 64位整数被正确打印。
顺便说一下,当编译为C
(将包含的头改为.h
)时,PRId64
定义的格式字符串为I64d
。使用此格式字符串在编译为C或c++时都不会给出警告。因此,一个可能的解决方法是使用
printf("%I64d", i);
另一个选择是使用-D__USE_MINGW_ANSI_STDIO
构建。
根据上面的建议,我做了以下操作,编译时没有警告。
// Needed to define the macros for data types in inttypes.h
#define __STDC_FORMAT_MACROS
// This part in header file (.h) re-used by this file as well as .c files compiled with C compiler
#ifdef __cplusplus
#include <cstdio>
#else
#include "stdio.h"
#endif
#include <cstdint>
#include <cinttypes>
#include <cstdio>
int main()
{
int64_t i = 0;
printf("%" PRId64, i);
}
这对我来说是一个很好的解决方案。