2009-06-03 7 views

답변

5

함수 프로토 타입은 외부 함수 용입니다. 내 규칙은 main()을 제외한 모든 비 정적 함수가 프로토 타입을 얻는다는 것입니다. 나는 '-Wmissing-prototypes'GCC 옵션을 사용한다. 일반적으로 함수를 정적으로 선언하는 것을 잊어 버리는 경우에 발생합니다. 두 번째 방법은 함수 '외설하는 파라미터 불특정 다수를 취한다는 것을 의미하기 때문에

void function(); 

:

void function(void); 

그리고하지 이러한 방법 :

도 C에서이 방법 함수를 선언 원하는대로 (ANSI C 이전과의 호환성을 위해).

+2

또한 .c 파일의 시작 부분에 정적 funcitons에 대한 프로토 타입을 사용합니다. 그렇게하지 않는 이유는 구현 순서에 대해 걱정할 필요가 없다는 것입니다. – gnud

+0

저는 정적 함수에 프로토 타입을 사용 했었지만 대부분은 그렇게하지 않았다고 확신 해 왔습니다. 프로토 타입이있는 경우 두 위치에서 정보를 반복합니다. 인터페이스의 경우에는 필수적이지만 정적 함수를 사용하는 이유는 무엇입니까? –

+0

@Chris : 일부 컴파일러는 범위에 프로토 타입이없는 경우 매개 변수에 대해 안전하지 않은 가정을하게됩니다. –

0

유일한 이점은 함수 자체를 변경할 때마다 함수 프로토 타입을 업데이트 할 필요가 없다는 것입니다.

+1

그건 단지 게으름입니다. – akappa

1

"편집 할 줄이 너무 적습니까?"

이 경우 유일하게 "이점"이 있습니다. 평범한 게으름입니다.

1

내가 생각할 수있는 유일한 '이점'은 코드를 변경하는 것이 적습니다. 일반적으로 이것은 단지 '게으른'것입니다.

어떤 경우에도 단점이 더욱 중요합니다. 하나의 소스 파일에 모든 기능이 있어야합니다. 소스 파일에있는 함수의 순서는 이제 중요합니다. 또한 다른 사람들은 헤더 파일을 보거나/혼란스러워 할 것입니다. 모범 사례는 .c와 .h입니다.

4

아니오.

엄격한 ANSI C에서도 합법적인지 여부는 알 수 없습니다.

+2

프로토 타입을 사용하지 않는 것은 합법적입니다. 선언되지 않은 함수를 사용하는 것은 합법적이지 않습니다. 모든 프로토 타입은 선언이지만 일부 선언은 프로토 타입이 아닙니다. variadic 함수에 대해서만 프로토 타입이 절대적으로 필수입니다. –

0

코드가 많이 바뀌므로 줄을 편집하는 횟수가 줄었습니까?

나는 그것이 이유라고 생각한다. 나는 다른 이유를 생각할 수 없다. 컴파일 스피드 변경 (실제적으로)도 실행 시간도 코드를 업데이트하기위한 시간도 아니다.

2

함수 프로토 타입에 적용 할 때 "코드 변경 사항이 많습니다"라고해도 코드가 잘못되었습니다. 인터페이스 (함수 서명)가 많이 변경되면 함수의 책임은 매우 명확하지 않습니다. 먼저 코드를 작성하기 시작한 후에 만 ​​문제를 하위 응답으로 나누는 방법을 파악합니다.

0

내가 생각할 수있는 유일한 장점은 .c 또는 .h 파일의 프로토 타입 섹션에 함수의 첫 번째 줄을 복사하여 붙여 넣지 않아도된다는 점입니다.

다른 파일에서 참조되는 기능의 경우 프로토 타입을 가질 수밖에 없습니다.

파일 범위 (즉, 정적 함수)가있는 함수의 경우 블록의 모든 프로토 타입을 파일 맨 위에 두는 것이 유용합니다.그런 식으로 모든 정적 함수는 해당 파일의 다른 곳에서 호출 할 수 있습니다. 프로토 타입이 없으면 함수 A()는 B()가 코드에서 위에 선언 된 경우에만 함수 B()를 호출 할 수 있습니다.

또한 일부 컴파일러는 범위에 프로토 타입이없는 경우 매개 변수에 대해 안전하지 않은 가정을합니다.

또한 MISRA-C를 준수해야하는 코드를 작성하는 경우 모든 함수의 프로토 타입 범위가 필요합니다.

프로토 타입을 살펴봄으로써 매개 변수의 목적을 명확히하기 때문에 프로토 타입에 매개 변수 이름 (합법적 인 것)이 아닌 매개 변수 이름이 포함되도록하는 것이 좋습니다.

0

타이핑이 적기 때문에 RSI의 위험이 줄어 듭니다.

관련 문제