C에서 다른 행에 함수 유형 및 메소드 이름을 배치하는 이유


16

방금 회사에서 시작했으며 첫 번째 코드 검토에서 스타일 설명 중 하나는 반환 유형과 메서드 이름이 다른 줄에 있어야한다는 것입니다. 예를 들어

void foo() {
}

이것이어야한다

void
foo() {
}

나는 항상 첫 번째 스타일을 사용해 왔으며 사람들이 왜 두 번째 스타일을 사용하는지 개인 취향 이외의 다른 이유가 있는지 궁금했습니다. 나는 첫 번째가 가독성을 전혀 손상시키지 않는다고 생각합니다. C 프로그래머와 대규모 오픈 소스 프로젝트에서 다른 하나보다 공통적인가?


3
이것은 GNU 표준에 있습니다 (반드시 좋은 것이라고 말하지는 않지만 브레이싱 스타일은 이상합니다). gnu.org/prep/standards/standards.html#Formatting
Gauthier

답변:


19

사람들이 왜 두 번째 스타일을 사용하는지 개인 취향 이외의 다른 이유가 있는지 궁금하십니까?

그것은 C의 초기 시절에 인기가 있었던 스타일이기 때문에 그 이유는 그것이 오랫동안 그렇게 해왔고, 그렇게 보이는 많은 코드를 가지고 있기 때문일 수 있습니다. 모두가 익숙합니다. 기업 모멘텀만큼 개인적인 취향은 아닙니다.

또 다른 이유는 함수 이름이 항상 첫 번째 열에서 시작하기 때문입니다. 리턴 유형은 길이가 다양하고 다소 복잡 할 수 있습니다. 유형을 자체 행에두면 함수 이름을 쉽게 찾을 수 있습니다.

회사에 스타일이 설정되어 있으면 코딩 표준 문서가있을 수도 있습니다. 물어보세요. 이 선택에 대한 이유를 설명 할 수 있으며 사본을 보유하면 향후 검토에서 유사한 문제를 피하는 데 도움이됩니다.


2
나는 그것이 아직도 많은 프로그래머들에 의해 사용되고 방어되는 80 자 제한에 연결되어 있다고 생각합니다. 80 자로 제한하고 설명적인 메소드 / 함수 이름을 사용하려면 약간의 타협을해야합니다. 메소드 헤더를 분할하는 것이 그중 하나입니다.
Sulthan

선언은 더 길 수 있습니다-호출 규칙 식별자 (stdcall 등), 심볼 가시성 (DLLEXPORT) 또는 __attributes 와 같은 다른 (비표준) 수정 자에 대해 생각하십시오 . 그리고 C ++을 볼 때 상대적으로 복잡한 반환 유형을 가질 수 있으므로 어딘가에 줄 바꿈을 추가해야 할 수도 있습니다.
johannes

@Sulthan 흥미롭게도 프로그래머 (단말기 창과 터미널 편집기를 사용하는 사람)가 아닙니다. 조판에서 일반적으로 72-80 문자는 가독성 측면에서 텍스트 열의 이상적인 너비로 간주됩니다. (따라서 TeX와 그 파생어가 일부 사람들이 기이하게 좁은 기둥을 고려하는 것으로 기본 설정하는 이유)
JAB

1
@JAB 사실은 지금입니다. 또한 정당화 된 텍스트를 읽는 것과 소스 코드를 읽는 것은 매우 다른 두 가지이며 공통점이 거의 없으므로 이상적인 너비는 관련이 없습니다.
Sulthan

1
"또 다른 이유는 함수 이름이 항상 첫 번째 열에서 시작하기 때문에 찾기가 더 쉽기 때문입니다." 그리고 이것은 시각적 인 이점 그 이상입니다. 이제 정규식을 검색 ^start_of_a_long_func하고 검색중인 함수로 즉시 이동할 수 있습니다.
underscore_d

7

이것은 내가 찾은 유일한 코드 형식 규칙이며 실제로 가독성에 눈에 띄는 영향을 미치며 거의 노력이 필요하지 않습니다 (코드 편집기가 당신과 싸우지 않는다고 가정).

선언 / 정의에서 이름이 일관된 위치에 표시되도록하는 것이 프로그래밍 언어 설계에 좋습니다. 근거는 간단합니다. 이름의 시작 부분을 즉시 찾는 데 사용할 수있는 멋진 시각적 앵커 (중괄호 또는 매달린 들여 쓰기)가 있습니다. 이름을 찾기 위해 파일을 스캔 할 때 실제로 언어를 구문 분석 할 필요는 없습니다.

문서를 형식화 할 때와 동일합니다. 새 섹션을 시작할 때 이름을 굵은 글꼴로 표시하고 (종종 자체 줄에) 구분되지 않고 긴 문장으로 묻지 않습니다.

초기 C에는 매우 간결한 서명이있었습니다. 반환 유형은 선택 사항이며 인수 뒤에 인수 유형이 선언되었습니다. 이름도 매우 짧았습니다. 이는 때때로 이름을 상쇄하는 리턴 유형의 영향을 완화했습니다.

double dot(x, y);

여전히 소화가 잘됩니다.

C ++은 이것을 조금 더 악화시켰다. 인수 유형 스펙을 서명으로 이동하여 서명을 더 길게 만듭니다. 이 구문은 나중에 C 표준화 중에 채택되었습니다.

static struct origin *find_origin(struct scoreboard *sb,
                  struct commit *parent,
                  struct origin *origin)

소화가 쉽지 않지만 나쁘지는 않습니다. (깃에서 발췌)

이제 길고 설명적인 이름과 매개 변수화 된 유형의 현대적인 프로그래밍 관행을 고려하고이 선택이 어떻게 비참한 지 살펴보십시오. Boost 헤더의 예 :

template <class A1, class A2, class A3, class A4, class A5, class A6>
inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&)
{ 
   typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type;
   return result_type(); 
}

일반 코드를 작성하는 경우 이와 같은 서명은 평범하지 않습니다. 너무 열심히 시도하지 않고도 이것보다 훨씬 더 나쁜 사례를 찾을 수 있습니다.

C, C ++ 및 그 파생어 인 Java 및 C #은 읽기 가능한 선언 / 정의를 갖는 예외입니다. 인기있는 전임자와 동료 (Fortran, ALGOL, Pascal)는 결과 유형 앞에 이름을 올렸으며, 많은 후임자 (Go, Scala, TypeScript 및 Swift)는 더 읽기 쉬운 구문도 선택했습니다.


1
포트란 프로그램을 작성할 필요가 없다는 점에 감사하십시오. 함수 인수를 선언하면 강제로 신경에 아주 빨리 도달 할 것입니다. 특히 함수 시그너처를 읽어서 어떤 인수가 필요한지 이해하려고 할 때 : C ++은 형식을 해당 위치에 놓으면 변수 이름을 시각적 키워드 검색으로 시작하여 형식을 결정합니다.
cmaster-monica reinstate

2
C ++에서 실제로 발명 한 함수 선언에 형식을 넣었습니까? 나는 그 경우에 대해 들어 본 적이 없으며 인용을 찾기 위해 고심하고 있습니다.
underscore_d

1
C 언어 개발을 참조하십시오 . 표준화 섹션에서 Ritchie는 C ++에서 구문을 빌려 왔다고 언급합니다.
user2313838

5

나는 C & C ++로 작업하는 19 년 동안이 스타일을 처음 만났습니다. 누군가이 악한 것을 발명 할 수있는 방법에 대해 거의 당황했습니다.

내가 찾을 수있는 유일한 (잠재적으로) 긍정적 인 점은 grep ^ FuncName을 사용하여 funciton 정의를 찾을 수 있다는 것입니다. 실제 도구를 싫어하는 일부 커뮤니티에서는 10 년 이상 전에 관련 요소가 될 수 있습니다 ... 내가 C ++ 및 클래스 멤버 기능에 적용되어이 특성도 죽이는 것을 보았습니다.

내 의견을 맞춰보세요. :)


1
grep -P '^(\w+::)?FuncName'
Kyle Strand

예, 함수 이름의 클래스 유형은 이것을 사용하는 것을 방해하지 않습니다. 따라서 소스 파일을 빠르게 탐색하는 데 여전히 유용합니다. 그것이 악한 것처럼 보이거나, 의견은 의견이다. 나는 그것이 더 좋아 보인다고 생각하게되었다.
underscore_d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.