можно объявить функцию в файле заголовка следующим образом?Объявление функции C
extern int ap(char[][]);
можно использовать char [] [] in функция?
можно объявить функцию в файле заголовка следующим образом?Объявление функции C
extern int ap(char[][]);
можно использовать char [] [] in функция?
Для двухмерного массива вам необходимо указать размер для последнего измерения, иначе компилятор не знает, как его использовать. (Это прекрасно, чтобы опустить имя, хотя.)
так:
extern int ap(char[][10]);
Тем не менее, это совершенно верно, чтобы опустить имена параметров в объявлениях функций. Когда вы определите функцию, однако вы должны дать массиву имя, а затем вы можете обратиться к нему с помощью этого имени.
Нет, вам нужно указать последние N-1 размеры для массива.
extern int ap(char[][DIMENSION]);
Для получения дополнительной информации смотрите here
Нет, это не допускается - он пытается объявить параметр как указатель на неполный тип массива.
типа массив должен быть завершен с размером, например:
extern int ap(char[][10]);
char[][]
не является допустимым типом массива, потому что вы не можете иметь массивы неполного типа, и char[]
является неполным. Я знаю, что это сбивает с толку, потому что у вас действительно есть два типа массивов, так что вот еще один пример с той же проблемой: char a[3][]
. Массив a имеет длину 3 и тип элемента char[]
, но char[]
является, опять же, неполным, и это invalid.
Когда у вас есть «многомерный массив», у вас действительно есть массив массивов. Например, typedef int U[3][5];
делает U массив длиной 3 массивов длиной 5 единиц и эквивалентен typedef int H[5]; typedef H U[3];
.
Причины вы можете опустить крайнее левое измерение с параметрами функции, потому что, с параметрами функции только, типами массивов вида T[N]
превращается в T*
и N может быть опущен, давая T[]
к T*
. Это относится только к «самому верхнему» или «внешнему» уровню.
Таким образом, все эти функции декларации идентичны:
int f1(int a[3][5]);
int f2(int a[][5]);
int f3(int (*a)[5]);
typedef int T[5];
int f4(T a[3]);
int f5(T a[]);
int f6(T* a);
Вы можете, конечно, удалить имя параметра в любом из вышеуказанных деклараций в, не меняя их.
Почему бы вам не попробовать и не узнать. –
@darren: «Попытка» очень редко - это правильный способ проверить правильность формулировки языка. Достаточно жертв, «он работает в GCC» там (на одном примере). – AnT