【发布时间】:2017-11-22 20:03:14
【问题描述】:
我有一个文件将被捆绑到两个共享库中。编译器创建两个版本的库:一个用于 32 位类型,另一个用于 64 位类型。现在我需要打印一个涉及变量的诊断日志:
size_t len;
打印语句格式说明符如下:
LOG("The length is %ld",len);
当编译器创建 64 位版本时,它会报错:
format specifies type 'unsigned int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat]
如果我将其从 %ld 更改为 %lu,则 32 位版本会报错:
format specifies type 'unsigned long' but the argument has type 'size_t' (aka 'unsigned int') [-Wformat]
如何避免 -Wformat 错误(当然抑制它不是我正在寻找的解决方案)?我是否必须求助于#ifdefs 来检查编译器版本并相应地编写诊断信息?
编译器版本:Clang 3.8(Android 平台)
编辑:有人将其复制到相关问题。让我举一个不同的例子,因为 size_t 似乎很常见:
jlong val;
LOG("val = %ld",val):
运行 32 位编译器时:
warning: format specifies type 'long' but the argument has type 'jlong' (aka 'long long') [-Wformat]
因此,如果我尝试将其更改为 %lld 以抑制警告,那么我会得到: 运行 64 位通行证时:
warning: format specifies type 'long long' but the argument has type 'jlong' (aka 'long') [-Wformat]
如何处理这种情况?再次重申:
编译器版本:Clang 3.8(Android 平台)
【问题讨论】:
-
我假设
LOG只是std::printf的包装宏? -
是的,你是对的,它是一个包装器。
标签: c++ java-native-interface clang compiler-warnings