编译器对混合使用"stdio.h"和<cstdio>



如果添加了第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,即使它是c++代码?

这似乎是一个已知的错误: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);
}

这对我来说是一个很好的解决方案。

相关内容

  • 没有找到相关文章

最新更新