洪民憙 (홍민희) 블로그

이하의 글은 2011년에 쓴 것입니다. 오래된 글인 만큼, 현재의 생각과 전혀 다른 내용도 많이 포함되어 있고, 당시와는 상황이 많이 달라진 점도 있습니다. 또한, 그 당시에 잘못 알려졌던 정보도 포함되어 있을 수 있습니다. 어찌됐든 저는 제 오래된 글이 회자되는 것을 저어합니다. 읽기에 앞서 양해를 부탁드립니다.

포인터를 선언하는 방법의 차이

dalinaum-kr:

materiality:

loveholy:

“애스터리스크를 타입에 붙여 쓰는 사람(ex. int* aPointer)은 이 변수가 포인터타입 변수라고 생각하는 사람이고, 변수 이름에 붙여 쓰는 사람(ex. int *aPointer)은 이 변수가 해당 타입이되 포인터라고 생각하는 사람입니다.”

— Cyrus.H

나는 원래 개념적으로 전자가 맞다고 생각하는데 C/C++ 문법의 한계 때문에 후자처럼 쓰는 부류다. 이를테면 int* a, b;와 같은 경우. 아무 생각 없이 이렇게 썼다가 피 볼 확률이 0이 아니니까.

가끔 차라리 ...

identification에 *, [], ()가 붙어야 된다고 생각하는 사람도 있습니다. 선언을 해석할 때는 identification을 중심으로 해석합니다. 아마 The C Programming Language를 보셨거나 cdecl을 쓰는 사람은 같은 방법으로 하는 분이 많을 겁니다.

또 이렇게 하지 않으면 *,[],()가 섞여서 사용될 때 해석하기 어렵거나 다른 컨벤션을 써야 할겁니다.

여담이지만 C/C++의 포인터 문법은 아래와 같은 형태가 되었어야 합니다.

int a*;
int a*[5];
int a[5]*;
int argv*[];
int argv[]*;
int func*();
int func()*;

일관성있고 어순과 일치하며 괄호가 필요없습니다.

나는 이렇게 되었으면 좋았을 거라고 생각한다:

int* a;
int*[5] a;
int [5]* a;
int*[] argv;
int[]* argv;
int*() func;
int()* func;