如果添加了第 4 行中的 include 语句(未注释),则以下程序会导致编译器警告。
编译器:gcc 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]
有人可以解释会发生什么吗?
我当然可以只使用 <cstdio> 来解决这个问题,这在这种情况下是正确的。
但这又引出了另一个问题……
假设我有一个包含在两个实现文件中的头文件——一个用 C 编译器编译,一个用 C++ 编译器编译。头文件需要使用“stdio.h”,因为它需要使用 C 编译器进行编译。这是否意味着包括该头文件在内的所有代码也必须使用“stdio.h”而不是 <cstdio>,即使它是 C++ 代码?