2014-10-20 1 views
1

자바가 콜백을 C로하고 그 직후에 초기화 할 때 유용한 전역 변수를 가진 사람의 코드를 다시 작성합니다. 접두어가 인 여러 곳에서이 변수를 선언 한 것으로 보입니다. 나는 이것을 왜 글로벌 변수 (접두사 g_)로 할 것인지를 알지 못한다. 나는 이것을 static이라고 부르며 한 번만 선언 할 것이다.C++에서 전역 변수를 갖는 방법

이 작업을 수행 할 수 있습니까? 아니면 static이이 컨텍스트에서 스레드 안전성에 부정적인 의미가 있습니까? 내 코드의 대부분은 C++이지만 자바가 호출하는 함수처럼 extern 'C'이있다.

현재 나는 extern 또는 static을 사용하고 있지 않지만 이것이 왜 링크 오류를 발생시키는 지 알고 싶습니다.

+0

C와 같지만 가장 좋은 전역 변수는 전역 변수가 아닙니다. – EJP

답변

3

static이 중 중복되는 변수를 방지하지 않습니다 여러 컴파일 단위의 컴파일. 이러한 컴파일 단위를 연결하면 결국 동일한 변수의 다른 "인스턴스"가 표시됩니다. 즉, 각자 자신의 복사본을 볼 수 있습니다.

extern의 유용성은이 중복을 방지하는 것입니다. 구현 파일 (.c)에 전역 변수 (static)를 선언하고 제공된 헤더 파일 (.h)에 extern으로 선언하여 종속 된 모든 소스 파일에 포함시킵니다. 당신은 extern, extern "C"static 혼합

+0

이것은 좋고 익숙한 것 같습니다. 감사. '.c' 파일이 없기 때문에'.cpp' 파일에 (''외부의 한정되지 않은) 선언문을 넣는 것이 허용 가능하다고 생각합니까? 그래, 작품, 대단히 감사합니다 @ jweyrich – John

+0

쿨! 물론이 .cpp와 .c는 동등합니다. – jweyrich

1

C에서와 마찬가지로 전역 변수를 가질 수 있습니다. 전역 변수는 C와 마찬가지로 공유 상태를 구성합니다. 즉, 여러 스레드에서 동시에 공유 상태에 액세스하는 경우 해당 언어의 모든 언어에서 사용할 수 있습니다 (at 적어도 하나의 변경 가능한 액세스) 동기화를 제공해야합니다.

extern "C" 연결 지정은 모두 C 연결 규칙을 사용하는 다른 언어로 컴파일 된 여러 번역 단위에서 동일한 변수에 액세스하려는 경우에만 필요합니다.

(C 달리가, C++ 전역 변수는 주문의 몇 가지 새로운 문제를 제공 사소하지 않은 초기화를 할 수 있습니다. 그러나 그것은 문제가 안된다.)

+0

저는이 질문에 매우 만족스럽지 않습니다.이 변수의 이름을 나타낼 링커 오류가 나타납니다. . 그 'exern "C"'단지 내 자바 콜백을위한 것이 었습니다, 나는 그것을 선택하지 않았거나, 변수에 대한'extern'도 아닙니다. mk 파일의 일부 링커 플래그를 사용하여 모든 컴파일 유닛이 C 링키지 규칙을 사용하도록 설정했다고 가정합니다 ? 어제 일한다고 확신합니다. – John

1

전역의 일반 변수 나 함수를 선언 할 때 변수 선언하기 전에 extern를 사용하는 경우, 컴파일러는 "공공의 상징"

로 노출 당신은 그것이 다른 파일에서 선언 된 공용 기호임을 지정합니다. extern을 사용하지 않으면 이미 정의 된 변수에 링크 오류가 발생합니다.

신고 전에는 static 키워드를 사용하면 기호가 공개되지 않으므로 선언 된 (또는 포함 된) 위치에서만 기호가 표시되지 않으므로 extern은 편집 할 수 없습니다. 그래서 같은 정적 변수를 두 번 선언 할 때 "이미 정의 된"링크 오류를 얻지 못하고 실제로 두 번 선언됩니다.

그리고 마지막으로 extern "C" make 변수가 C++ 규칙이 아닌 C 규칙에 게시되었습니다. 가장 큰 차이점은 "오버로드"입니다. C++에서 여러 함수는 서로 다른 인수 유형을 사용하여 같은 이름을 가질 수 있으므로 함수 이름에 유형을 유지하는 규칙이 필요합니다. C에서 이름은 공개 기호 이름입니다.C++ 함수를 C 또는 다른 언어에서 사용할 수 없도록 만들거나 다른 C++ 컴파일러 버전에서 사용할 수 없게 만들 때 wn't을 사용해야합니다.

관련 문제