2010-03-03 7 views
5

다음과 같은 방법으로 헤더 파일에 함수를 선언 할 수 있습니까?C 함수 선언

extern int ap(char[][]); 

우리는 함수에서 char [] []를 사용할 수 있습니까?

+8

왜 시도하고 알아 내면 되나요? –

+2

@darren : "시도 중"은 언어 구조의 유효성을 테스트하는 올바른 방법이 아닙니다. 그곳에는 "GCC에서 작동합니다"라는 희생자가 충분히 있습니다 (한 예로). – AnT

답변

5

2 차원 배열의 경우 마지막 치수에 대한 크기를 지정해야합니다. 그렇지 않으면 컴파일러에서이를 사용하는 방법을 알 수 없습니다. (그것은 비록 이름을 생략 괜찮습니다.)이 같은

:

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

그러나 함수 선언에서 매개 변수 이름을 생략하는 것은 완전히 유효합니다. 그러나 함수를 정의 할 때 배열에 이름을 지정해야하며이 이름으로 참조 할 수 있습니다.

7

아니, 당신이 배열의 마지막 N-1 크기를 지정해야합니다. 자세한 내용은

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

1

아니,이 허용되지 않습니다 here 봐 - 그것은 불완전한 배열 유형에 대한 포인터로 매개 변수를 선언하려고 시도합니다. 당신이 불완전한 형태의 배열을 가질 수 있기 때문에

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

char[][]가 유효한 배열 형식이 아니며, char[]이 불완전 :

배열 유형

이 같은 크기로 완료해야합니다. 나는 두 개의 배열 타입을 가지고 있기 때문에 혼란 스럽다는 것을 알고 있습니다. 그래서 같은 문제가있는 또 다른 예제가 있습니다 : char a[3][]. 배열 은 길이가 3이고 요소 유형이 char[]이지만 char[]은 다시 불완전하며 invalid입니다.

"다차원 배열"을 사용하는 경우 실제로는 배열 배열이 있습니다. 예를 들어 typedef int U[3][5];U으로 길이가 5 인 ints 배열의 길이가 3 인 배열을 만들고 typedef int H[5]; typedef H U[3];과 같습니다. 만약 함수 파라미터를 가지는 가장 좌측의 치수를 생략 할 수

이유는 단지 함수 파라미터 형태 T[N]의 배열 종류 T*로 변환되고, NT*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); 

당신은 물론,이를 변경하지 않고 매개 변수 이름 에게 위의 선언의에서을 삭제할 수 있습니다.