我有一个文件,它将被捆绑到两个共享库中。编译器创建了两个版本的库:一个用于32位类型,另一个用于64位类型。现在我需要打印一个涉及变量的诊断日志:
size_t len;
,print语句格式说明符如下:
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平台)
答案 0 :(得分:0)
如果你有一个支持C ++ 17的编译器,你可以这样做。
enum class Environment { bit32, bit64 };
#ifdef __x86_32__
constexpr Environment environment = Environment::bit32;
#elif __x86_64__
constexpr Environment environment = Environment::bit64;
#endif
void print_statement()
{
if constexpr (environment == Environment ::bit32) {
// do your 32 bit thing.
}
else if constexpr (environment == Environment ::bit64) {
// do your 64 bit thing.
}
}