相关疑难解决方法(0)

为什么将未使用的返回值转换为void?

int fn();

void whatever()
{
    (void) fn();
}
Run Code Online (Sandbox Code Playgroud)

是否有任何理由将未使用的返回值转换为无效,或者我是否认为这完全是浪费时间?

跟进:

那看起来相当全面.我认为这比评论未使用的返回值更好,因为自我记录代码比评论更好.就个人而言,我会关掉这些警告,因为这是不必要的噪音.

如果一个虫子逃脱,我会吃掉我的话......

c c++ void

105
推荐指数
7
解决办法
4万
查看次数

在 Java 中布尔类型转换没用吗?

我看到 boolean 的显式强制转换语法在语法上(boolean)是合法的,但我想不出它的用途。相应的 Boolean 对象——或者更确切地说是在 boolean 和 Boolean 之间来回转换——由自动装箱处理。所以它看起来像是编译器的无用语言工件。是否有我缺少的功能场景?

java types boolean

64
推荐指数
3
解决办法
6434
查看次数

解析void()和int()之间的区别

阅读了最令人烦恼的解析后,我进行了一些实验并找到了这个程序.有两条非常相似的线.其中一个在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++ most-vexing-parse language-lawyer

12
推荐指数
1
解决办法
317
查看次数

遍历 C++ 17 中的映射键

我正在寻找一种在 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++ c++17

7
推荐指数
1
解决办法
5584
查看次数

类型转换变量使其无效?

我最近遇到了这段代码,我很困惑,它是做什么用的?

在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数据类型。

c typecast-operator

5
推荐指数
1
解决办法
88
查看次数

强制转换为 void 以避免使用重载的用户定义逗号运算符

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 是为了避免用户定义的逗号运算符针对表达式类型重载的可能性。

我的问题是:

  1. 如何使用强制转换为 void 来“避免用户定义的逗号运算符重载表达式类型的可能性”?我的意思是,任何人都可以举出任何例子,如果我们不使用void此代码会给出错误吗?例如,假设我们有一个名为 的类SomeClass,它重载了逗号运算符。现在,如果我们不使用,这会成为问题吗void

  2. static_cast在这种情况下可以使用 C 风格的强制转换吗?例如,类似的东西static_cast<void>(t.size())。我正在阅读使用 C++17 功能的示例,因此我想知道为什么作者在这种情况下使用了 C 风格转换。

我读过强制转换为“void”到底有什么作用?,从中我得到的印象是,如果我们使用(void)xthen 这意味着抑制编译器警告,并且还意味着“忽略 x 的值”。但后来我无法理解表达式x和之间的区别(void)x

c++ casting void c++11 c++17

5
推荐指数
1
解决办法
262
查看次数

以下调用在C中意味着什么?

我正在探索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代码中尝试执行零值和非零值,但操作类似,但两种情况下的响应都相同。

任何帮助,将不胜感激。

c cortex-m

4
推荐指数
1
解决办法
83
查看次数

函数指针强制转换为 void 而不被调用

在细读一些 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)

c embedded syntax compiler-optimization

2
推荐指数
1
解决办法
76
查看次数