2010-03-03 2 views
5

можно объявить функцию в файле заголовка следующим образом?Объявление функции C

extern int ap(char[][]); 

можно использовать char [] [] in функция?

+8

Почему бы вам не попробовать и не узнать. –

+2

@darren: «Попытка» очень редко - это правильный способ проверить правильность формулировки языка. Достаточно жертв, «он работает в GCC» там (на одном примере). – AnT

ответ

5

Для двухмерного массива вам необходимо указать размер для последнего измерения, иначе компилятор не знает, как его использовать. (Это прекрасно, чтобы опустить имя, хотя.)

так:

extern int ap(char[][10]); 
1

Тем не менее, это совершенно верно, чтобы опустить имена параметров в объявлениях функций. Когда вы определите функцию, однако вы должны дать массиву имя, а затем вы можете обратиться к нему с помощью этого имени.

7

Нет, вам нужно указать последние N-1 размеры для массива.

extern int ap(char[][DIMENSION]); 

Для получения дополнительной информации смотрите here

1

Нет, это не допускается - он пытается объявить параметр как указатель на неполный тип массива.

типа массив должен быть завершен с размером, например:

extern int ap(char[][10]); 
4

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); 

Вы можете, конечно, удалить имя параметра в любом из вышеуказанных деклараций в, не меняя их.

Смежные вопросы