Я только узнал, что это незаконно в С++ (но законно в C):
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_LENGTH(A) (sizeof(A) / sizeof(A[0]))
int accumulate(int n, const int (*array)[])
{
int i;
int sum = 0;
for (i = 0; i < n; ++i) {
sum += (*array)[i];
}
return sum;
}
int main(void)
{
int a[] = {3, 4, 2, 4, 6, 1, -40, 23, 35};
printf("%d\n", accumulate(ARRAY_LENGTH(a), &a));
return 0;
}
Он компилируется без проблем с помощью gcc -std=c89 -pedantic
, но не скомпилируется с помощью g++
. Когда я пытаюсь скомпилировать его с помощью g++
, я получаю следующие сообщения об ошибках:
main.cpp:5:37: error: parameter 'array' includes pointer to array of unknown bound 'int []'
int accumulate(int n, int (*array)[])
^
main.cpp: In function 'int main()':
main.cpp:18:50: error: cannot convert 'int (*)[9]' to 'int (*)[]' for argument '2' to 'int accumulate(int, int (*)[])'
printf("%d\n", accumulate(ARRAY_LENGTH(a), &a));
Я использовал это в своем C-коде в течение длительного времени, и я понятия не имел, что это незаконно в С++. Для меня это выглядит как полезный способ документировать, что функция принимает массив, размер которого неизвестен раньше.
Я хочу знать, почему это законный C, но недействительный С++. Я также задаюсь вопросом, что это заставило комитет С++ принять решение убрать его (и нарушить эту совместимость с C).
Итак, почему этот законный C-код, но незаконный код на С++?