int fn();
void whatever()
{
(void) fn();
}
Run Code Online (Sandbox Code Playgroud)
是否有任何理由将未使用的返回值转换为无效,或者我是否认为这完全是浪费时间?
跟进:
那看起来相当全面.我认为这比评论未使用的返回值更好,因为自我记录代码比评论更好.就个人而言,我会关掉这些警告,因为这是不必要的噪音.
如果一个虫子逃脱,我会吃掉我的话......
我看到 boolean 的显式强制转换语法在语法上(boolean)是合法的,但我想不出它的用途。相应的 Boolean 对象——或者更确切地说是在 boolean 和 Boolean 之间来回转换——由自动装箱处理。所以它看起来像是编译器的无用语言工件。是否有我缺少的功能场景?
阅读了最令人烦恼的解析后,我进行了一些实验并找到了这个程序.有两条非常相似的线.其中一个在g ++ 7和clang ++ - 3.9中产生警告,另一个则没有.
int main() {
void(); // no warning
int(); // warning: statement has no effect
}
Run Code Online (Sandbox Code Playgroud)
在第二行中,创建了一个默认构造的类型对象int并立即销毁,因此未使用.但是第一行会发生什么?如果以相同的方式解析它,则应该是错误,因为创建类型的对象是非法的void.另一方面,它看起来也不像函数声明.
我正在寻找一种在 C++ 17 中遍历映射键的方法。我现在想到的方法是基于这个问题的答案,方法如下所示。
for (auto const& [i, val] : myMap)
...
Run Code Online (Sandbox Code Playgroud)
但是,我不需要使用 value val,我只需要 value i。因此,这段代码...不包含对 value 的任何调用val。因此,每当我编译代码时,都会出现以下警告消息:
warning: unused variable ‘val’ [-Wunused-variable]
for (auto const& [i, val] : myMap){
^
Run Code Online (Sandbox Code Playgroud)
我想要的是找到一种方法来遍历(仅)地图的键,而忽略这些值。有谁知道该怎么做?
我最近遇到了这段代码,我很困惑,它是做什么用的?
在C编程语言中,将变量void类型转换为数据类型是什么意思?这有什么作用?
如果执行了诸如类型转换或加法之类的表达式,而结果没有立即分配给某个变量,则该结果将丢失。您为什么要这么做?这似乎是一个无用的表达。
代码示例:
int main(int argc, char *argv[])
{
/* void unused vars */
(void) argc;
(void) argv;
// more code here
return 0;
}
Run Code Online (Sandbox Code Playgroud)
看来作者没有使用这些变量,但是为什么将它们转换为void数据类型?您最好将它们转换为int数据类型。
void我正在学习 C++ 中的模板,并遇到了一个使用强制转换的示例:
template<typename T>
auto func (T const& t) -> decltype( (void)(t.size()), T::size_type() )
{
return t.size();
}
Run Code Online (Sandbox Code Playgroud)
解释中写道:
将表达式强制转换为 void 是为了避免用户定义的逗号运算符针对表达式类型重载的可能性。
我的问题是:
如何使用强制转换为 void 来“避免用户定义的逗号运算符重载表达式类型的可能性”?我的意思是,任何人都可以举出任何例子,如果我们不使用void此代码会给出错误吗?例如,假设我们有一个名为 的类SomeClass,它重载了逗号运算符。现在,如果我们不使用,这会成为问题吗void?
static_cast在这种情况下可以使用 C 风格的强制转换吗?例如,类似的东西static_cast<void>(t.size())。我正在阅读使用 C++17 功能的示例,因此我想知道为什么作者在这种情况下使用了 C 风格转换。
我读过强制转换为“void”到底有什么作用?,从中我得到的印象是,如果我们使用(void)xthen 这意味着抑制编译器警告,并且还意味着“忽略 x 的值”。但后来我无法理解表达式x和之间的区别(void)x。
我正在探索sdk,并且遇到了以下语句。
uint32_t init_time = 0;
init_time = get_current_time_in_ms();
(void)init_time; // What does this statement do?
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是,这是某种形式的NULL检查,但我在测试C代码中尝试执行零值和非零值,但操作类似,但两种情况下的响应都相同。
任何帮助,将不胜感激。
在细读一些 STM32 中间件代码时,我遇到了这个非常奇怪的行并且无法解析它。基本上就是,
(void)(foo);
Run Code Online (Sandbox Code Playgroud)
这不是空指针转换 - 这很简单。它不是调用函数并将其返回值转换为 void - 这将需要更多的括号。它看起来像一个没有左值的右值。这只是防止功能被优化掉的空操作吗?或者它实际上有什么作用?
这是在上下文中。
// SVCCTL_EvtAckStatus_t is just an enum typedef
typedef SVCCTL_EvtAckStatus_t (*SVC_CTL_p_EvtHandler_t)(void *p_evt);
void SVCCTL_RegisterCltHandler( SVC_CTL_p_EvtHandler_t pfBLE_SVC_Client_Event_Handler )
{
#if (BLE_CFG_CLT_MAX_NBR_CB > 0)
// Ignore all this
SVCCTL_CltHandler.SVCCTL_CltHandlerTable[SVCCTL_CltHandler.NbreOfRegisteredHandler] = pfBLE_SVC_Client_Event_Handler;
SVCCTL_CltHandler.NbreOfRegisteredHandler++;
#else
// This is the weird stuff
(void)(pfBLE_SVC_Client_Event_Handler);
#endif
return;
}
Run Code Online (Sandbox Code Playgroud)