선언되었지만 C ++에서 정의되지 않은 정적 함수
C ++를 사용하는 다음 코드에서 오류가 발생합니다.
Main.cpp
#include "file.h"
int main()
{
int k = GetInteger();
return 0;
}
File.h
static int GetInteger();
File.cpp
#include "file.h"
static int GetInteger()
{
return 1;
}
내가 얻는 오류 :
Error C2129: static function 'int GetInteger(void)' declared but not defined.
유명한 기사 "Organizing Code File in C and C ++"를 읽었 지만이 코드의 문제점을 이해하지 못합니다.
C ++ static
에서 전역 / 네임 스페이스 범위에서 함수 / 변수는 정의 된 번역 단위에서만 사용되며 다른 번역 단위에서는 사용되지 않습니다.
여기에서 Main.cpp
정의 된 번역 단위 ( ) 와 다른 번역 단위 ( ) 의 정적 함수를 사용하려고합니다 File.cpp
.
제거하면 static
제대로 작동합니다.
변화
static int GetInteger();
...에
int GetInteger();
static
이 경우 내부 연결 메서드를 제공합니다 . 즉, 정의한 번역 단위에서만 사용할 수 있습니다.
당신은 그것을에서 정의하고 그것을 File.cpp
사용하려고 시도 main.cpp
하지만 main은 당신이 그것을 선언했기 때문에 그것에 대한 정의가 없습니다 static
.
이 경우 static
함수 이름에 내부 연결이 있음을 의미하기 때문입니다. 그게 GetInteger
하나 개의 번역 단위에 관련이없는 GetInteger
다른 번역 단위입니다. 키워드 static
는 오버로드됩니다. 어떤 경우에는 수명에 영향을 미치고 다른 경우에는 바인딩에 영향을 미칩니다. "정적"이 평생의 이름이기도하므로 여기서는 특히 혼란 스럽습니다. 네임 스페이스 범위에서 선언 된 함수 및 데이터는 항상 정적 수명을 갖습니다. static
선언에 나타날 때 외부 대신 내부 바인딩이 발생합니다.
static으로 선언 된 함수는 포함하는 파일에 로컬입니다. 따라서 함수를 호출하는 파일과 동일한 파일에 함수를 정의해야합니다. 다른 파일에서 호출 가능하게하려면 정적으로 선언해서는 안됩니다.
내 이해에 따르면 정적 함수는 정의 된 파일 이름으로 이름이 변경되므로 main.cpp에 file.h를 포함하면 getInteger ()가 file.cpp에 GetInteger ()를 정의했지만 main.cpp로 변경됩니다. 정적이기 때문에이 이름의 함수가 존재하지 않기 때문에 링커도 GetInteger ()의 정의를 찾을 수 없습니다.
나는 교훈이 인터페이스의 일부가 아니기 때문에 헤더 파일에서 정적 함수를 선언하지 않는다고 생각합니다.
모든 것이 동일한 번역 단위에 있으면 작동합니다. 아마도 File.cpp를 Main.cpp와 동일한 단위로 컴파일하지 않았을 것입니다.
g++ -Wall File.cpp Main.cpp
각 파일이 개별적으로 컴파일되는 경우 함수는 extern
다른 번역 단위에서 사용 되도록 만들어야 합니다.
extern int GetInteger();
이것은
int GetInteger();
참고 URL : https://stackoverflow.com/questions/10812769/static-function-declared-but-not-defined-in-c
'IT TIP' 카테고리의 다른 글
정규식까지만 포함되지 않음 (0) | 2020.11.29 |
---|---|
콘텐츠 언어 용 HTML 메타 태그 (0) | 2020.11.29 |
Bootstrap에서 테두리를 사용하는 방법 (0) | 2020.11.29 |
텍스트 파일 작성 방법 Java (0) | 2020.11.29 |
Android Fragments에 작업 표시 줄 옵션 메뉴를 추가하는 방법 (0) | 2020.11.29 |