2012-01-23 2 views
11

C에서 정적 함수의 프로토 타입을 가지고 있어야하는지에 대해서는 잘 모르겠습니다. 이러한 함수를 내 보내지 않는 한 (즉, 외부 링키지가없는 경우) 이것이 다른 어떤 이점을 줄 수 있는가?'static'함수의 프로토 타입

감사합니다.

답변

6

예. 함수에 특정 유형이 있는지 확인해야하는 경우 유용 할 수 있습니다. 당신이 함수 프로토 타입을 선언하지 않을 경우

// Define how the functions should be defined. 
typedef void * jobfunc(void *); 

// Use case 
void addjob(jobfunc *); 

// Ensure they have the right type. Without this, you only get a warning 
// for addjob(job2) (see below) - with it, you get an error for the mismatch. 
static jobfunc job1; 
static jobfunc job2; 

// Define one job 
static void * job1(void * arg) { 
    return NULL; 
} 

// Define another job - accidentally wrong. 
static void * job2(int accidentally_wrong) { 
    return NULL; 
} 
+3

필자는 typedef를 함수 템플릿의 일종으로 사용하는 것이 다소 모호한 습관이라고 생각합니다. 아마도 독자를 혼동시킬 것입니다. 예를 들어 코드가 실제로하는 것을 해석하는 데 시간이 걸렸습니다. 코드에 대한 즉각적이지만 잘못된 반응은 "aha-function pointer"였습니다. – Lundin

+0

@ Lundin 특이한 당신은 옳습니다. 그러나 그것은 그 일을합니다. 어쩌면'void *'리턴 타입이 혼란을 야기했을지도 모른다. 예를 들어, 나는 다른 타입을 가져야했다. 그러나 이것이 왜 그렇게 이상한 지 이해하지 못합니다. 올바른 유형을 보장하는 것이 좋으며, 알 수없는 것으로 인해 가독성과 혼란을 제외하고는 불이익을 볼 수 없습니다. – glglgl

6

구현 전에 사용하려면 프로토 타입을 작성해야합니다.

일반적으로 함수의 순서는 변경할 수 있지만 정적 함수가 2 개인 경우 서로 호출하면 어떻게됩니까?

+0

@ 마크 : 예를 들어, 컴파일러는'foo'에 대한 호출이 올바른 매개 변수를 푸시하는지 확인하기 위해'foo' 함수에 대한 호출을 구문 분석하기 전에'foo' 함수의 서명이 무엇인지 알아야합니다. . –

+0

asaelr : 귀하의 의견에 정교 할 수 있습니까? '구현하기 전에 사용'이란 무엇을 의미합니까? ouah가 작성한 것처럼 – Mark

+0

이 말했습니다. 위의 호출자 함수를 호출 할 수 있다는 것을 의미합니다. – asaelr

3

하나의 (사소한) 편의는 파일에서 원하는 곳 어디에서나 기능을 배치 할 수 있다는 것입니다. 예를 들어, 유틸리티 함수를 파일의 끝에 배치하려면이를 선언해야합니다.

함수를 선언해야하는 경우 파일에서 처음으로 놓인 함수가 다른 함수를 아직 보지 않았으므로 상호 재귀 함수가 두 개있는 경우입니다.

4

static 함수의 정의가없는 선언 (extern 함수의 경우도 마찬가지 임)을 사용하면 함수가 정의되기 전에 함수를 호출 할 수 있습니다. C에서 함수에 대한 식별자를 사용하기 전에 선언되어야한다 :

static void foo(void); 

void bar(void) 
{ 
    foo(); 
} 

static void foo(void) 
{ 
    ... 
} 
+0

종합적인 답변을 보내 주신 모든 분들께 감사드립니다! – Mark

8

일부 권한을 인용하기 위해, MISRA-C : 2004 규칙 8.1도 외부 링크와 기능에 대한 프로토 타입을 적용하지만, 내부 연결을 언급 :

"내부 연결 기능이있는 프로토 타입을 제공하는 것이 좋은 프로그래밍 습관이다."

내외부 연계 기능간에 코딩 스타일을 일관되게 유지하기 때문에이 방법을 사용하는 것이 좋습니다. 그리고 다른 사람들이 답변에서 언급 한 것처럼, 그것은 또한 편리합니다.

+1

이것은 내가 동의하는 몇 가지 MISRA 규칙 중 하나입니다. 필자는 항상 소스 파일의 맨 위에 소스 파일에 정의 된 모든'정적'함수의'static' 함수 선언을 넣었습니다. 이것은 코드와 내부 API에 대한 좋은 문서입니다. – ouah

0

아래의 코드는 유효합니다 :

이것이 고려하십시오.

static int bar() 
{ 

}; 

int foo() 
{ 
    bar("asdf"); 
}; 

이러한 종류의 숨겨진 오류는 위험 할 수 있습니다. "2 7 .2.2 함수 인수 형 검사"섹션을 다시 체크하면 C++을 사용하는 원리와 실습이 유용 할 수 있습니다 [Bjarne Stroustrup].