Wformat 用于为两种不同变体处理的库
Wformat for library processed for two different variants
我有一个文件,它将捆绑到两个共享库中。编译器创建库的两个版本:一个用于 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.
}
}
相关文章:
- 用于矢量处理的多个线程
- 开放 CV 中的动态内存分配,用于视频处理
- 余数运算符的等效操作,用于处理低于允许的最小值
- 用于处理多个通信协议处理的设计类
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- Aysnc 处理程序用于 POCO Websocket 中的传入消息
- G++ (C++14) 链接器错误,用于处理 C++03 代码
- CPP -D 选项,用于预处理 Fortran 代码
- GTK 将一个处理程序用于多个小部件
- Wformat 用于为两种不同变体处理的库
- 用于视频处理的图像缓冲区
- read() 的参数类型,用于 c++ 中的文件处理
- 用于批处理分配的库
- 用于对编译时字符串进行哈希处理的延迟指针
- 如何在 Python 3 中正确处理用于嵌入的字符串
- 用于立体视觉的OpenCV分散处理
- 用于处理重新启动时剩余天数的逻辑
- (C )正在创建专门用于处理所有其他自定义对象的类/对象一种处理项目的正确方法
- 处理用于构造有用值的旧变量
- 处理用于创建算法的多个版本的 #ifdef