2014-10-10 3 views
3

static 키워드를 추가 한 헤더 파일에 메서드가 있습니다. 예 :사용하지 않는 함수 경고

static int32_t Tlvlist_AddRawt(Tlvlist *a, uint8_t type, uint16_t size, const void *bytes); 

방법은 정적 키워드 함수명에 존재하지 않는이 .c 파일에서 구현된다.

이 메서드는 같은 .c 파일의 다른 함수에서 호출됩니다. 나중에이 함수 (이 정적 함수를 사용함)는 main에서도 호출됩니다.

경고 : "사용하지 않은 함수 'Tlvlist_AddRawt'"가 헤더 파일에 있습니다. 왜 이런 일이 발생합니까?

ps. 나는 Xcode를 사용한다.

+0

왜 '정적'을 추가 했습니까? – Kevin

+0

@ 케빈 : 왜 보통 추가됩니까? 일부 액세스 제어 –

+2

작업을 수행하려면 다른 파일이이 기능을 보거나 사용할 수 없도록하십시오. – Kevin

답변

7

함수 선언을 정적으로 표시하면 해당 함수가 나타나는 번역 단위 외부에 표시되지 않습니다. 또한이 단어가 나타나는 모든 번역 단위에서 다른 기능을 나타내는 을 나타냅니다. 따라서 헤더 파일에 static을 사용하는 것이 좋습니다. 헤더를 포함하는 각 C 소스에서 별도의 함수를 선언하기 때문에.

컴파일러 진단은 헤더가 포함 된 C 파일이 하나 이상 있지만 헤더에서 선언과 함께 사용되는 Tlvlist_AddRawt()의 정의를 제공하지 않는다는 것을 알려줍니다.

정적 함수를 정의와 별도로 선언하려는 경우 (예 : 소스 파일의 앞부분에 나타나는 다른 함수를 프로토 타입 화하려면) C 소스 파일의 맨 위에 선언을 넣습니다 그 본문이 머리글 대신에 나타납니다. 머리글에 넣는 것은 비생산적입니다.

4

static 함수를 만드는 목적은 모듈 외부의 사용자로부터 "숨겨져"있기 때문에 다른 모듈에서 사용할 목적으로 헤더 파일에 함수를 선언하지 마십시오. 정적 C 함수는 정의 된 변환 단위 * 내에서만 볼 수 있습니다. 함수가 정적으로 선언되었지만 동일한 번역 단위의 다른 함수가 사용하지 않으면 "사용되지 않은 정적"경고가 나타납니다.

한 파일에서 함수를 정의하고 다른 파일에서 사용하려면 머리글에 해당 선언을 넣고 두 번역 단위의 머리글을 포함하고 번역 결과를 함께 링크해야합니다. 헤더에서 static 키워드를 제거하면이 문제를 해결할 수 있습니다.

*번역 단위은 .c 파일의 멋진 이름입니다.

+1

@georgem 그러면 헤더에 '정적'이라고 선언 할 필요가 없습니다. 사실, 헤더에'static' 함수를 선언하는 좋은 유스 케이스가 있습니다. Xc 파일 자체의 맨 앞 부분에'static' 키워드와 함께 첫 번째 선언을 넣습니다. 함수의 사용.헤더에서 제거하고 컴파일하십시오. – dasblinkenlight

+2

@dasblinkenlight : 이것은 유용 할 수 있습니다 만,'inline static' (C99) forward 선언의 경우와 헤더 내에서의 그러한 정의와 함께 (즉 선언은 실제로 필요하지 않습니다). 나는 그것이 적어도 약간의 의미를 만드는 유일한 예외라고 생각한다. –

관련 문제