具有 0 个参数的函数 - void 与 void*?

Function with 0 arguments - void vs void*?

我知道你可以像这样声明一个没有任何参数的函数:

void test()
{
    cout << "Hello world!!" << endl;
}

不过我也看到了

void test(void)
{
    cout << "Hello world!!" << endl;
}

void test(void*)
{
    cout << "Hello world!!" << endl;
}

我的问题是:这里使用voidvoid*有什么区别?

What is the difference between using void and void* here?

当参数类型为void时,调用函数时必须不带任何参数。

当参数类型为 void* 时,必须使用 void* 参数或可以转换为 void*.

的参数调用函数

void 代表“无”,但 void* 不代表“指向无的指针”。事实上,情况恰恰相反。 void* 代表指向除 void 之外的任何内容的指针。这是矛盾的,但这就是语言定义这两者的方式。

C++ 中没有参数的函数的唯一形式应该是

void test();

表格:

void test(void)

这就是在 . But in C++ use this form only for interfacing with 中定义无参数函数的方式:

extern "C"
{
void test(void);
}

这个表格:

void test(void*)

不是没有参数的函数。它有一个未命名的 void* 类型的参数。它在调用时需要一个 void* 指针。

在这里查看什么是 void* 指针的解释:What does void* mean and how to use it?

My question is: What is the difference between using void and void* here?

(void) 参数列表与空参数列表相同。 void 这里的 void 在 C++ 中什么都不做,除非需要与 C 兼容,否则是不必要的 - 请参阅答案的第二部分。

(void*) 不接受 0 个参数。它接受 1 个参数。参数的类型是void*,是指针类型。


Why is it like this?

因为与 C 向后兼容。在 C 中,(void) 是声明只接受空参数列表的函数的唯一方法。 () 参数列表声明任何函数而不指定参数。参数的数量可以是任意的,包括 0。在 C 中使用 () 参数列表正在成为一个过时的功能。

引自C11标准草案N1548:

Function declarators (including prototypes)

An identifier list declares only the identifiers of the parameters of the function. An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters. The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.

Future language directions

Function declarators

The use of function declarators with empty parentheses (not prototype-format parameter type declarators) is an obsolescent feature.

Function definitions

The use of function definitions with separate parameter identifier and declaration lists (not prototype-format parameter type and identifier declarators) is an obsolescent feature.

C 之所以采用这种方式,是因为它与未声明参数列表的旧版本(准标准)C 向后兼容。

在 C++ 中,函数的这两个声明

void test();

void test(void);

是等价的,意味着该函数不接受任何参数。

在 C 中,第一个函数声明声明了一个带有空标识符列表的函数,第二个函数声明声明了一个带有实际上没有参数的参数类型列表的函数。

根据 C 标准(6.9.1 函数定义):

5 If the declarator includes a parameter type list, the declaration of each parameter shall include an identifier, except for the special case of a parameter list consisting of a single parameter of type void, in which case there shall not be an identifier. No declaration list shall follow.

这个函数的声明(也就是它的定义)

void test(void*)
{
    //...
}

有1个参数,一个void *类型的对象(注意指针总是完整类型),不在函数内使用。

此声明在C++中有效,在C中无效,因为在C中,函数声明中的每个函数参数都具有一个参数类型列表,同时它的定义应该有一个标识符,除了在使用 void 参数的情况,如上面引述中所指定。

在 C 中,只有当声明与其定义的类型不同时才可以使用这样的声明。

所以在 C 中你可以这样写

void test(void*); // declaratipon

然后

void test( void *ptr ) // declaration and definition
{
    //...
}