Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么C和C++;?_C++_C - Fatal编程技术网

C++ 为什么C和C++;?

C++ 为什么C和C++;?,c++,c,C++,C,我有下面的C/C++程序,我编译它时会显示所有警告 intfoo(intx){return 5;} C++编译器给我一个关于未引用的形式参数的警告。当我删除“x”使签名读作“intfoo(int)”时,编译器很高兴 另一方面,C编译器喜欢命名的参数,并且在未命名时发出警告 编辑:它发出错误,而不是警告 为什么不同?理由是什么 另外,我正在使用GNU编译器工具链。我也一直想知道这一点,但在任何情况下,您都可以通过实际命名参数x,并在正文中的某个地方说: (void)x; 正如您所说,可以通过移

我有下面的C/C++程序,我编译它时会显示所有警告

intfoo(intx){return 5;}

C++编译器给我一个关于未引用的形式参数的警告。当我删除“x”使签名读作“intfoo(int)”时,编译器很高兴

另一方面,C编译器喜欢命名的参数,并且在未命名时发出警告

编辑:它发出错误,而不是警告

为什么不同?理由是什么


另外,我正在使用GNU编译器工具链。

我也一直想知道这一点,但在任何情况下,您都可以通过实际命名参数
x
,并在正文中的某个地方说:

(void)x;

正如您所说,可以通过移除参数名来修复C++中的警告。在C语言中,不允许省略参数名。因此,如果您的C编译器产生相同的警告,您将无法删除它。因此,您的C编译器不会产生这样的警告。

它们是不同的语言,具有不同的规则

在C语言中,函数参数必须有名称;我很惊讶你得到的是警告而不是错误。我猜其基本原理是没有充分的理由使用未使用的参数;如果你不需要它,为什么它会存在?(当然,有一些忽略参数的有效案例,比如使用指定一组特定参数的函数指针时,大概是没有考虑到那些普通的函数值得去放松规则。如果你需要忽略它,那么<代码>(空)未被使用;应该禁止任何“未使用的参数”。否则您可能会收到警告。)


<>在C++中,函数必须具有特定的签名,以便重写在基类中声明的虚拟函数,或者匹配模板参数的特定用法。很可能并非所有覆盖都需要该签名的所有参数,在这种情况下,忽略该参数是非常合理的。我猜这就是允许您不命名它的理由。

C的一个原因可能是它仍然有只包含标识符的旧式参数列表:

int f(to)
double to; {
  return to;
}

<>基本上,当只看到一个标识符时,必须假定这是一个变量名而不是一个类型。

< P> C和C++是不同的语言,它们有不同的规则,这是它们不太类似的许多领域之一。 :

6.9.1功能定义 …
5如果声明器包括参数类型列表,每个参数的声明应 包括一个标识符,由单个
void
类型的参数,在这种情况下,不应有标识符。无申报清单 接下来就是。 我的

8.4功能定义[dcl.fct.def] 8.4.1概述[dcl.fct.def.general] …
6. [注意:未使用的参数不需要命名。例如,

void print(int a, int) {
std::printf("a = %d\n",a);
}
-[完注]

现在,关于为什么C需要所有参数的标识符,无论它们是否被使用,C++都没有的更大的哲学问题,请记住以下:

C超过C++大约十年左右;李>
  • C的设计使它的编译器易于编写
  • C不支持函数重载

  • 简言之,没有充分的理由说明C应该允许未使用的参数不命名,至少有一个充分的理由(简化解析)说明C不应该这样做

    您确定C编译器在您省略名称时只是发出警告吗?这应该是一个错误。C标准不允许省略参数名。有什么区别?语言.@ SEPP2K-C和C++标准不区分警告和错误。违反可诊断规则需要“诊断”。发出诊断后,合格的编译器可以继续编译代码,并对代码进行合理的处理。我不确定为什么会投反对票,但我投了赞成票。我用自己的代码来做这件事。如果在实际有用的情况下保持警告的生成(“哎呀,我使用了错误的参数!”)。@JimBuck-除非你有一个有用的编译器,警告你尽管有强制转换,但代码没有效果,否则这是一个很好的方法。我没见过这种情况。只是我从来都不喜欢这个解决方案(但我没有投反对票)。@PeteBecker-演员阵容的重点是防止这种“代码无效”的警告发生。这在我处理的所有编译器(gcc、LLVM、VC++和SNC[PlayStation])上都有效。@JimBuck-是的,我理解这一点。我考虑过添加一个笑脸,也许应该添加。我不确定您是否正确理解为什么C需要参数名——在某些情况下,在C中使用未使用的参数是有意义的:例如回调函数需要有指定的签名,但可能不需要它们的所有参数。我认为这是因为,如果不是这样的话,旧式语法中的参数类型是可选的,会有歧义。在C语言中,您可能需要提供一个函数作为指向其他函数的函数指针参数。函数所需的签名可能包含您不使用的参数,但您仍然需要定义它们。因此,在C++中,虚拟函数的情况也一样。@ SEPP2K:正如我所说,这只是猜测;在过去的五十年中,我没有参与指导C语言发展的任何决策。我只是在你写评论时添加了一个关于有效用例的注释。我不确定我是否同意简化解析器。编译器仍然需要能够解析函数指针声明,而这些声明不需要参数名。一旦您的解析器能够处理这些问题,似乎就不需要为han做太多额外的工作了