Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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
指向未指定大小的数组的指针;(*p)[];在C+中是非法的+;但在C语言中是合法的 我发现这在C++中是非法的(但是在C中是合法的): 我在C代码中使用了很长时间,我不知道C++中是非法的。对我来说,这似乎是一种有用的方法来记录一个函数接受一个数组,而这个数组的大小以前是未知的 我想知道为什么这是合法的C,但是C++无效。我还想知道是什么原因使得C++委员会决定把它拿走(并打破了与C的兼容性)。 为什么在C++ C++标准化之前,这个法律C代码是非法的C++代码?< /p>_C++_C_Arrays_Function_Pointers - Fatal编程技术网

指向未指定大小的数组的指针;(*p)[];在C+中是非法的+;但在C语言中是合法的 我发现这在C++中是非法的(但是在C中是合法的): 我在C代码中使用了很长时间,我不知道C++中是非法的。对我来说,这似乎是一种有用的方法来记录一个函数接受一个数组,而这个数组的大小以前是未知的 我想知道为什么这是合法的C,但是C++无效。我还想知道是什么原因使得C++委员会决定把它拿走(并打破了与C的兼容性)。 为什么在C++ C++标准化之前,这个法律C代码是非法的C++代码?< /p>

指向未指定大小的数组的指针;(*p)[];在C+中是非法的+;但在C语言中是合法的 我发现这在C++中是非法的(但是在C中是合法的): 我在C代码中使用了很长时间,我不知道C++中是非法的。对我来说,这似乎是一种有用的方法来记录一个函数接受一个数组,而这个数组的大小以前是未知的 我想知道为什么这是合法的C,但是C++无效。我还想知道是什么原因使得C++委员会决定把它拿走(并打破了与C的兼容性)。 为什么在C++ C++标准化之前,这个法律C代码是非法的C++代码?< /p>,c++,c,arrays,function,pointers,C++,C,Arrays,Function,Pointers,: 委员会决定,像这样的职能,接受 指向具有未知边界的数组的指针或引用,复杂 C++中的声明匹配和过载解决规则。这个 各委员会一致认为,由于这些职能没有多大效用和作用 是相当罕见的,这将是最简单的只是禁止他们。因此 C++草稿现在写成: 如果参数的类型包括指向 T的未知界数组或对T的未知界数组的引用 T、 这个程序格式不好 C++没有C的“兼容类型”概念。在C语言中,这是一个完全有效的变量重新声明: extern int (*a)[]; extern int (*a)[3]; enum E {

委员会决定,像这样的职能,接受 指向具有未知边界的数组的指针或引用,复杂 C++中的声明匹配和过载解决规则。这个 各委员会一致认为,由于这些职能没有多大效用和作用 是相当罕见的,这将是最简单的只是禁止他们。因此 C++草稿现在写成:

如果参数的类型包括指向 T的未知界数组或对T的未知界数组的引用 T、 这个程序格式不好


C++没有C的“兼容类型”概念。在C语言中,这是一个完全有效的变量重新声明:

extern int (*a)[];
extern int (*a)[3];
enum E { A, B, C };
extern enum E a;
extern unsigned int a;
在C中,这是对同一函数的完全有效的重新声明:

extern void f();
extern void f(int);
在C中,这是特定于实现的,但通常是同一变量的有效重新声明:

extern int (*a)[];
extern int (*a)[3];
enum E { A, B, C };
extern enum E a;
extern unsigned int a;
C++没有这些功能。在C++中,类型是相同的,或者是不同的,如果它们是不同的,那么就很少关注它们是如何不同的。 同样地

int main() {
  const char array[] = "Hello";
  const char (*pointer)[] = &array;
}
在C中有效,但在C++中无效:
数组
,尽管有
[]
,但声明为长度为6的数组<代码>指针声明为指向未指定长度的数组的指针,该数组是另一种类型。没有从
常量字符(*)[6]
常量字符(*)[]]
的隐式转换

因为C++中的指针指向未指定长度数组的功能在C++中几乎是无用的,而且几乎肯定是程序员的一个错误。如果您从一个具体的数组实例开始,那么几乎总是已经有了大小,因此您无法获取它的地址以便将其传递给函数,因为这样会导致类型不匹配

并且在示例中也不需要指向非指定长度数组的指针:在C中编写的正常方式(也正好在C++中是有效的)是

int accumulate(int n, int *array)
{
    int i;
    int sum = 0;
    for (i = 0; i < n; ++i) {
        sum += array[i];
    }
    return sum;
}
int累加(int n,int*数组)
{
int i;
整数和=0;
对于(i=0;i

被称为<代码>累积(ARAYLYLATH(A),A) .< /P>当C++分裂时存在的C版本有未指定大小的数组?我认为,在那些日子里,您必须将它们声明为指针,并且能够使用

[]< C/ + >是一个后来的加法。C++是从C89中分裂出来的,并且例子编译时没有问题,使用<代码> Gcc-STD= C89-PoangNoint < /代码>,所以我不认为它是一个后来的添加。注意,如果你把<代码> n>代码>转换成模板参数(<代码>模板<代码>),并且在数组类型中使用(<代码> int(*数组)[n]),则代码应该工作。
)。还要注意,甚至可以使用对数组的引用而不是指向数组的指针:
int(&array)[n]
。然后用
accumulate(&a)
调用它,让编译器为您推断
n
;)将“指向任意大小数组的指针”指定为函数参数的常规方法是
accumulate(int n,int array[])
,这在C和C++@chrisdd中都是合法的(并具有预期的效果):糟糕的英语是不明确的。我的意思是:“我同意你的意见,除了一件事:
int-array[]
是误导性的。为了更清楚,你应该把它写成
accumulate(int-n,int*array)
”这里数组没有被修改,这就是为什么我还建议
const
。这项禁令已经被,在上次委员会会议上通过。有一个允许转换的开放窗口。@T.C.啊,很高兴知道。我想如果它真的被允许,它可能只会在一个方向被允许。从
char(*)[6]
char(*)[]
的隐式转换是安全的,但从
char(*)[]
char(*)[6]
的隐式转换是不安全的。因为在C中,甚至没有任何转换(类型只是兼容),所以您可以编写类似
int main(){int array[6];int(*ptr1)[]=&array;int(*ptr2)[100]=ptr1;}
的代码,这类代码通常不会得到任何编译器警告,更不用说错误了。