Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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/4/c/55.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,关于下面附加的代码片段,我有一个问题。无论如何,我在ideone.com上运行了这个片段,得到了两个不同的结果 :成功 :错误: C++中的结果是我所期望的,但是它在C中运行成功,并且它看起来像是编译器依赖的,因为在帮助聊天的人上运行的片段只得到了警告。 我错过了哪一部分?C是否自动进行了一些转换 #包括 #包括 #定义len2 void foo(int*a[][10],尺寸长度){ printf(“%s\n”,“已成功调用foo”); } 内部主(空){ //a是(int*)的10数

关于下面附加的代码片段,我有一个问题。无论如何,我在ideone.com上运行了这个片段,得到了两个不同的结果

  • :成功
  • :错误:

C++中的结果是我所期望的,但是它在C中运行成功,并且它看起来像是编译器依赖的,因为在帮助聊天的人上运行的片段只得到了警告。 我错过了哪一部分?C是否自动进行了一些转换


#包括
#包括
#定义len2
void foo(int*a[][10],尺寸长度){
printf(“%s\n”,“已成功调用foo”);
}
内部主(空){
//a是(int*)的10数组的LEN数组
int*a[LEN][10]={{0};
//但是标识符'a'将衰减为int*[10]类型的指针
//p1是指向(int*)的10数组的指针
int*(*p1)[10]=0;
傅(a,LEN),;
foo&a,LEN;
返回0;
}

这在C中无效。将gcc与
-Wall-Wextra
一起使用,它会输出以下内容:

x1.c: In function ‘main’:
x1.c:19:9: warning: passing argument 1 of ‘foo’ from incompatible pointer type [-Wincompatible-pointer-types]
     foo(&a, LEN);
         ^
x1.c:5:6: note: expected ‘int * (*)[10]’ but argument is of type ‘int * (*)[2][10]’
 void foo(int* a[][10], size_t len) {
      ^~~
这些类型不兼容。它只显示为警告,因为C倾向于允许各种指针转换,即使它们不正确

但是,您可以执行以下操作:

int *(*p1)[10] = a;

foo(a, LEN);
foo(p1, LEN);

这在C中无效。将gcc与
-Wall-Wextra
一起使用,它会输出以下内容:

x1.c: In function ‘main’:
x1.c:19:9: warning: passing argument 1 of ‘foo’ from incompatible pointer type [-Wincompatible-pointer-types]
     foo(&a, LEN);
         ^
x1.c:5:6: note: expected ‘int * (*)[10]’ but argument is of type ‘int * (*)[2][10]’
 void foo(int* a[][10], size_t len) {
      ^~~
这些类型不兼容。它只显示为警告,因为C倾向于允许各种指针转换,即使它们不正确

但是,您可以执行以下操作:

int *(*p1)[10] = a;

foo(a, LEN);
foo(p1, LEN);

激烈的编辑;正如评论中指出的那样,先前的回答是错误的

<>程序在C和C++中都不正确。但各自语言的标准并不禁止成功编译违反强制约束的程序。这允许实现扩展该语言。实现只需要发出诊断消息。警告和错误都是一致的行为


无论什么原因,编译时使用的编译器(通过IDENN)选择编译C++时的行为不同。正如评论中指出的那样,先前的回答是错误的

<>程序在C和C++中都不正确。但各自语言的标准并不禁止成功编译违反强制约束的程序。这允许实现扩展该语言。实现只需要发出诊断消息。警告和错误都是一致的行为



不管怎样,编译时使用的编译器(通过IDENN)在编译C++时选择不同的行为。< /P>它并不是真正成功的,编译器至少应该给你一个警告。用适当的C标志编译给出<代码>错误:不兼容的指针类型传递int类型(*)(2)[10 ],以类型为int型参数(*)(10)'/COD>。给出正确的错误。在ideone,你应该选择C99而不是C。传统的C在类型转换方面非常宽松。对C++的要求更严格。在适当的警告级别下,C也会警告你。在另一方面,这可能是我第一次看到标签C和C++在单个问题中正确使用的时候。这并不是真的成功,编译器至少应该给您一个警告。使用足够的C标志编译会出现

错误:不兼容的指针类型将'int*(*)[2][10]'传递给'int*(*)[10]'类型的参数。
。给出正确的错误。在ideone,你应该选择C99而不是C。传统的C在类型转换方面非常宽松。对C++的要求更严格。在适当的警告级别下,C也会警告你。在另一方面,这可能是我第一次看到标签C和C++在单个问题中正确使用的时候。只要启用
-学究式错误
,就会使它成为一个错误,这是应该的。如果它是一个警告,那么它不是无效的<代码>-Wall-Wextra拒绝接受严格来说是有效的代码,因为你们都是对的。代码在语法上正确,但在语义上不正确。警告通常在语法正确的代码上发出警告,这些代码很可能在语义上不正确或具有意外的语义。@user463035818:“有效”和“无效”在C标准中不是定义良好的术语。对于带有原型的函数调用,参数将通过赋值进行转换(C 2018 6.5.2.2 7),而不会隐式执行其他转换(8)。对于赋值,这违反了约束条件(6.5.16.1 1),因为将非void指针赋值给非void指针的唯一可接受的方式是兼容类型(在限定符上有一定的灵活性)。@EricPostIschil是的,它们没有很好的定义,但是如果我正确阅读您的注释,根据C标准,代码是“不正常”的。事实上,我不记得是什么让我写了那篇评论,也许我误读了答案,因为这意味着得到警告意味着代码无效,而答案并没有宣称这一点。无论如何,感谢您提供的详细信息仅启用
-学究式错误将使其成为错误,这是应该的。如果它是警告,则它不是无效的<代码>-Wall-Wextra
拒绝接受严格来说是有效的代码,因为你们都是对的。代码在语法上正确,但在语义上不正确。警告通常在语法正确的代码上发出警告,这些代码很可能在语义上不正确或具有意外的语义。@user463035818:“有效”和“无效”在C标准中不是定义良好的术语。对于带有原型的函数调用,参数将通过赋值进行转换(C 2018 6.5.2.2 7),而不会隐式执行其他转换(8)。对于赋值,这违反了约束条件(6.5.16.1 1),因为非空指针到非空指针的唯一可接受赋值是针对兼容类型的(在限定符上有一定的灵活性)。@EricPostpischil是的,它们没有很好的定义,不过如果我读了你的com