针对两种不同变体处理的库的Wformat

时间:2017-06-20 10:18:47

标签: c++ java-native-interface clang compiler-warnings

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

1 个答案:

答案 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.
   }
}