繁体   English   中英

如何在语言级别将变量标记为已初始化?

[英]How to mark a variable as initialized at the language level?

我正在使用链接的 C 库将值放入变量中。

void f_wrapper(int& v){
   auto s = f_legacy(&v);
   if(s != success) throw std::runtime_error{};
}

...

  int value;  // clang-tidy complains here: using "variable 'value' is not initialized"
  f_wrapper(value);

但是,clang-tidy 在这里抱怨:使用“变量'值'未初始化”。

据了解,这仅仅是因为编译器无法看穿链接的function。

我不想做int value = 0 (因为我相信库会初始化value并且我相信“部分形成”的值。)另外,我不想添加// NOLINT(warning)只是为了抑制警告。 (这种模式经常重复。)

有什么我可以做的将value标记为在语言中初始化的吗?

我正在寻找类似的东西:

void f_wrapper(int& v) {
   auto s = f_legacy(&v);
   if(s != success) throw std::runtime_error{};
   [[mark initialized(v)]];
}

最坏的情况我可以在 wrapper中执行此操作,因为至少我没有看到主代码不必要的初始化,但在初始化 arrays 的情况下非常麻烦。 我也不想为此初始化付出代价或选择默认值。

void f_wrapper(int& v) {
   v = int{};  // initialize to suppress warning at high level code
   auto s = f_legacy(&v);
   if(s != success) throw std::runtime_error{};
}

这不是您想听到的,但实际上只有一种方法可以在标准 C++ 中“在语言级别”初始化变量——那就是初始化它 这真的是直截了当的。 正如您在问题中已经描述的那样,您基本上被这个或NOLINT所困扰。 这不是一个迷人的解决方案,也不是你所追求的; 但确实没有更好的方法。

我确信可能有办法“欺骗”工具使其认为它已初始化,但任何此类建议充其量都相当于黑客攻击。

那就是说; 假设导致 grief 的clang-tidy检查是cppcoreguidelines-init-variables规则,值得注意的是,这只触发整数、布尔值、浮点数、双精度数和指针——默认初始化这样一个值的成本通常可以忽略不计. 除非您已经对此成本进行了基准测试并发现默认初始化这是一个真正的瓶颈,否则几乎没有理由避免这种做法。

通常,初始化变量是消除此问题的最干净/最安全的方法,并且无论如何都是最佳实践。 如果不进行初始化,只需要f_legacy中的一个错误即可导致意外 UB。 如果f_legacy有任何错误,例如它返回成功但忘记为v设置一个值,那么v将不会被初始化并且将正式成为 UB——这只是为了保存默认初始化的原语。


只是一个建议:

根据您的“最坏情况” f_wrapper示例,不必初始化其他人的未初始化值,是否可以更改 API 以返回初始化值而不是初始化传入的值? 如果(大概)遗留的 function 失败, f_wrapper已经抛出,这意味着您将始终必须有一个值。 在我看来,在这里初始化比初始化调用者的可能未初始化的值要少得多:

int f_wrapper() {
   auto v = int{};
   auto s = f_legacy(&v);
   if(s != success) throw std::runtime_error{};

   return v;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM