相关疑难解决方法(0)

"(void)!ptr"做什么?

我在阅读pugixml源代码时看到它,我真的不知道为什么会这样.

void foo(void* ptr) {
    (void)!ptr;  // What does this line do?
}
Run Code Online (Sandbox Code Playgroud)

c++

8
推荐指数
1
解决办法
389
查看次数

为什么无效转换功能很奇怪?

为什么以下程序

#include <iostream>

struct C
{
    operator int()
    {
        std::cout << "C::operator int()" << std::endl;
        return 0;
    }
    operator void()
    {
        std::cout << "C::operator void()" << std::endl;
    }
};

int main()
{
    C c;
    (int)c;
    (void)c;
    // this does run the function:
    // c.operator void();
}
Run Code Online (Sandbox Code Playgroud)

输出这个

C::operator int()
Run Code Online (Sandbox Code Playgroud)

而不是这个?

C::operator int()
C::operator void()
Run Code Online (Sandbox Code Playgroud)

coliru现场演示.

一如既往,直接的回答是"因为标准是这么说的".

C++ 11标准,§12.3.2

转换函数从不用于将(可能是cv限定的)对象转换为(可能是cv限定的)相同的对象类型(或对它的引用),转换为该类型的(可能是cv限定的)基类(或引用它)或(可能是cv-qualified)void.

那么为什么标准会这样说呢?使空洞转换功能成为特殊情况有什么好处?

其他说明见脚注116:

这些转换被视为标准转换,用于重载解析(13.3.3.1,13.3.3.1.4),因此初始化(8.5)和显式转换(5.2.9).转换为void不会调用任何转换函数(5.2.9).即使从未直接调用执行转换,也可以声明此类转换函数,并且可以通过调用基类中的虚拟转换函数来实现.

我只是习惯于(void)对有关未使用变量的编译器警告进行静音.它看起来基本上也是其他人使用它的东西.

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

如果void转换函数遵循典型的转换函数规则,则可能会出现意外情况,但对于任何具有副作用的转换函数而言都是如此,并且创建这些意外将由程序员自行决定.

c++ type-conversion language-lawyer c++11

8
推荐指数
0
解决办法
131
查看次数

C++转换为void的目的是什么?

可能重复:
将未使用的返回值转换为void

我读了一些源代码,并在其中声明了接口类中的许多虚函数,并默认实现如下:

virtual bool FunctionName(TypeName* pointer)
{
   (void)pointer;
   return true;
}
Run Code Online (Sandbox Code Playgroud)

请问在默认实现中将指针转换为void的目的是什么?

c++ virtual

6
推荐指数
2
解决办法
3158
查看次数

什么是 (void) 和 () 在 C 中

最近发现了这行代码,但是不知道带()的void是什么意思。有人能帮我吗 ?谢谢

(void) myFunc();
Run Code Online (Sandbox Code Playgroud)

c void

6
推荐指数
2
解决办法
94
查看次数

具有返回值的函数(C++)

当main()调用一个返回值为某种数据类型(原始或用户定义)的函数时,调用该函数的语句"通常"是一个赋值.

例如: -

class complex
{

private:

    int real;
    int imag;

public:

    complex();
    complex(int r,int i);
    complex operator + (complex c);
};
Run Code Online (Sandbox Code Playgroud)

假设,我的重载"+"的定义是这样的 -

complex complex::operator + (complex c)
{
    this->real = this->real + c.real;
    this->imag = this->imag + c.imag;
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

我的主要功能如下 -

int main()
{
    complex c1;
    complex c2(5,4);
    c1+c2;
}
Run Code Online (Sandbox Code Playgroud)

在上面的main()中,考虑语句c1 + c2.编译器将其视为c1.operator +(c2).当main调用此函数时,它会向main()返回一个值.这个返回值会发生什么变化?

c++ function

3
推荐指数
1
解决办法
342
查看次数

空铸有什么作用?

我正在阅读一些源代码,然后出现了这个问题;

struct Cookie *
Curl_cookie_add(struct SessionHandle *data, /* rest of params were here */)
{
/* unrelated things were here */
#ifdef CURL_DISABLE_VERBOSE_STRINGS
  (void)data;
#endif
/* rest of function goes here */
}
Run Code Online (Sandbox Code Playgroud)

如您所见,void cast 指针甚至没有分配给变量。我想知道这样做的目的是什么。

c casting void

3
推荐指数
1
解决办法
503
查看次数

为什么void指针指向任何东西?

当某些东西被转换为无效时,则该值变为NULL.但是,为什么void*指向任何数据类型?虚空指针不应该没用吗?

c

3
推荐指数
1
解决办法
573
查看次数

什么是(void)(p)在这做什么?

我正在检查代码,我遇到了以下代码段:

int check(char *a)
{

    (void)(a);//What is this line doing??
    return 0;
}

int main(void) 
{

    char *p;
    p=(char *)malloc(sizeof(char));
    check(p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(void)(a);做什么?

c

3
推荐指数
1
解决办法
1447
查看次数

未知的C表达式

我在示例程序中遇到了以下行,并且不知道它是什么.我想这是一个函数调用,但我不确定:

(void) pthread_mutex_init(&bottleneck, &mxattr);    
Run Code Online (Sandbox Code Playgroud)

如果是函数调用,为什么它以(void)开头?我以前从未见过这个.这是更多背景下的界限:

attr_init(pthread_process, pthread_scope, stacksize);    
(void) pthread_mutex_init(&bottleneck, &mxattr);    
barrier_init(&setup_barrier, (2 * ntables) + 1);    
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助.整个程序来自本Solaris白皮书(附录D)

c

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

这个陈述有什么作用?

可能重复:
将未使用的返回值转换为void
C++转换为void的目的是什么?

在使用CMake 下载并构建GDCM代码后,我偶然发现了这个问题:

void error_callback(const char *msg, void *) {
    (void)msg;
    gdcmErrorMacro( "Error in gdcmopenjpeg" << msg );
}
Run Code Online (Sandbox Code Playgroud)

第一行有什么作用?从来没有见过这样的东西.请记住,如果重要的话,我告诉CMake使用Visual Studio 2010进行构建.

c++ syntax

0
推荐指数
1
解决办法
133
查看次数

使用static_cast <void>()的目的是什么?

static_cast<void>()是编写void转换的'C++方式'

在en.cppreference.com网站上提到丢弃表达式的值.在下面链接解释部分的四个点

http://en.cppreference.com/w/cpp/language/static_cast

我们应该在哪里和为什么使用static_cast<void>()?举个例子..

c++ casting void static-cast

0
推荐指数
1
解决办法
1010
查看次数

为什么open()在linux 1.0中没有'fd'返回?

由于'fd'没有返回,它后来如何读/写?

例如:

void init(void)
{
 ....
 (void) open("/dev/tty1",O_RDWR,0);
 ....
Run Code Online (Sandbox Code Playgroud)

c linux kernel driver

0
推荐指数
1
解决办法
98
查看次数