GCC가 로컬 변수에 대해 사용하지 않은 변수의 오류를 제공하지만 글로벌 변수에는 그렇지 않은 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/664414

  •  21-08-2019
  •  | 
  •  

문제

GCC에 관한 질문이 있습니다. 기능에서 변수를 로컬로 정의하지만 변수가 고유 한 파일에서 전역이 아닌 경우에 변수를 로컬로 정의 할 때 미사용 변수의 오류가 발생하는 이유는 무엇입니까?

다른 사람에게 사용할 수 있다는 것을 이해할 수 있지만 그렇게하려면 외부 단어를 올바르게 넣어야합니까?

미리 감사드립니다.

도움이 되었습니까?

해결책

"고유 한 파일의 글로벌"이라는 경우 "int x;" 어떤 함수 이외에도, 컴파일러 작업이 아니며 다른 컴파일 장치 (예 : Errno)가 필요한 경우 변수를 링커에 사용할 수 있어야합니다.

당신이 의미한다면 "static int x" 링커에서 사용할 수없는 경우, 이것은 아마도 GCC가 선택한 것일 것입니다. 나는 컴파일러가 믿지 않는다 필수의 이를 알리고 주소 공간에 몇 바이트를 낭비하는 것 외에는 실제 손상이 없습니다.

다른 팁

컴파일러는 전역 변수를 사용하는지 알 수있는 방법이 없습니다. 예를 들어 완전히 다른 언어로 작성된 컴파일 장치에서 사용할 수 있습니다.

전역 변수는 컴파일러가 알 수없는 다른 장소에서 사용할 수 있기 때문입니다. 예를 들어 외부 라이브러리 O 프로그램.

사용하지 않은 현지인은 컴파일러에 의해 결정될 수 있습니다. 사용하지 않은 글로벌은 객체 파일에서 공유 할 수 있기 때문에 링커에 의해서만 결정될 수 있습니다.

일반적으로 링커는 Code-Gen에 대한 경고를하지 않습니다.

변수가 글로벌이면 컴파일러는 프로젝트의 모든 컴파일 장치에 대한 전체 가시성을 갖지 않습니다. 변수는 다른 컴파일 장치에서 수정 될 수 있습니다. 링커는 사용하지 않았 음을 알 수 있습니다. 아마도 객체 파일에서 제거 할 것입니다.

글로벌이라면 나중에 연결되는 다른 모듈에서 사용할 수 있기 때문입니다.

모든 글로벌을 단일 파일로 정의하는 것은 일반적인 관용구입니다. 이 파일에는 모든 변수를 사용하는 코드가 훨씬 적을 수 있습니다.

Android2.3에서 dalvikvm을 만들 때 같은 질문을했고 요점의 열쇠를 얻었습니다. 컴파일러의 매개 변수가 너무 엄격하기 때문입니다.

local_cflags += -werror.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top