Wformat 用于为两种不同变体处理的库

Wformat for library processed for two different variants

本文关键字:处理 用于 两种 Wformat      更新时间:2023-10-16

我有一个文件,它将捆绑到两个共享库中。编译器创建库的两个版本:一个用于 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(安卓平台)

编辑:有人将其复制到相关问题。让我用一个不同的例子来提出它,因为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(安卓平台)

如果你有一个支持 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.
}
}