Ich habe gerade herausgefunden, dass dies in C++ illegal ist (aber legal in C):Zeiger auf Array von nicht näherer Größe "(* p) []" illegal in C++, aber legal in 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;
}
Es kompiliert ohne Probleme mit gcc -std=c89 -pedantic
aber nicht kompilieren mit g++
. Wenn ich versuche, es zu kompilieren g++
mit erhalte ich diese Fehlermeldung:
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));
Ich habe für eine lange Zeit in meinem C-Code mit dieser und ich hatte keine Ahnung, dass es in C++ illegal war. Für mich scheint dies eine nützliche Möglichkeit zu sein, zu dokumentieren, dass eine Funktion ein Array benötigt, dessen Größe vorher nicht bekannt ist.
Ich möchte wissen, warum dies legal C ist, aber C++ ungültig. Ich frage mich auch, was das C++ - Komitee dazu gebracht hat, es wegzunehmen (und diese Kompatibilität mit C zu brechen).
Warum ist dieser legale C-Code aber illegaler C++ - Code?
Hat die Version von C, die bei der Trennung von C++ existierte, Arrays nicht definierter Größe? Ich denke, dass man sie damals als Zeiger deklarieren musste, und die Verwendung von '[]' war eine spätere Ergänzung. – Barmar
C++ wurde von C89 getrennt und das Beispiel kompiliert ohne Probleme mit 'gcc -std = c89 -pedantic', also glaube ich nicht, dass es eine spätere Addition war. – wefwefa3
Beachten Sie, dass Ihr Code funktionieren sollte, wenn Sie 'n' in einen Template-Parameter (' template ') umwandeln und diesen im Array-Typ verwenden (' int (* array) [n] '). Beachten Sie auch, dass es sogar (und meistens einfacher) möglich ist, einen Verweis auf ein Array anstelle eines Pointers auf ein Array zu verwenden: 'int (& array) [n]'. Dann rufe es mit "accumulate (& a)" auf und lass den Compiler "n" für dich ableiten! ;) –
leemes