【问题标题】:Wformat for library processed for two different variants [duplicate]为两种不同变体处理的库的 Wformat [重复]
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-12-01
    • 1970-01-01
    • 2022-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2020-08-28
    • 2020-02-06
    • 1970-01-01
    相关资源
    最近更新 更多