알고리즘 프로젝트로 실로 오랜만에 C 언어로 프로그램을 작성했다. 숙제하는 도중에 다른 사람이 쓴 코드를 여러 개 읽었는데, 한 가지 눈에 거슬리는 점이 있었다.
typedef struct { int v; // neighboring vertex int weight; // weight } edge; edge* findLongestEdge(struct edge *edges) { ............ }
이름만 봐도 이 함수가 하는 일이 뭔지 알 수 있다. 그래프의 간선 집합을 매개변수로 받아, 가장 긴 것을 반환한다. 얼핏 보기엔 아무 문제 없다. 하지만 내가 보기엔 문제가 있다.
내가 이 프로그램을 작성한 사람이라면 괜찮다. 하지만 어느날 전임자에게 레가시 코드를 넘겨 받았다면 어떨까? struct edge *edges
가 edge의 배열을 뜻할까? 그럴수도 있고, 그렇지 않을 수도 있다. 함수 이름을 봐선 여러 개의 edge를 넘겨 받는 건 분명하다. 그러나 배열로 넘겨 받는다는 보장은 없다. 특히 C나 C++에선 링크드 리스트를 많이 사용한다. 구조체 edge가 이렇게 구현되어 있다면 어떨까?
typedef struct { int v; // neighboring vertex int weight; // weight struct edge *next; } edge;
이런 경우라면 struct edge *edges
는 edge의 배열이 아니라, 어떤 edge 인스턴스의 포인터일 것이다. 그러니 가독성을 높이기 위해서 첫 번째 경우는 edge* findLongestEdge(struct edge edges[])
로, 두 번째 경우는 edge* findLongestEdge(struct edge *edges)
로 표기하는 편이 낫다고 생각한다.
Author Details
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
음.. 요즘은 어레이를 기술하는구낭 @.@;
보통은 typedef로 어레이형 타입(C 특성답게 말로만)을 선언해 줬는데;;
옛날엔 안 되었던가요? 제가 기억하는 한도 내에서는 줄곧 이렇게 프로그래밍해 왔는데, 또 오래 전 컴파일러에선 오류가 났던 것 같기도 하고….. 기억이 가물가물해요. ㅠ.ㅠ