2009-03-19 2 views
2

gcc와 관련하여 질문이 있습니다. 변수를 로컬 함수에 정의 할 때 사용되지 않는 변수의 오류가 발생하지만 변수가 고유 한 파일에서 전역 변수가 아닌 경우에는 왜 오류가 발생합니까?gcc가 지역 변수에 대해 사용하지 않는 변수에 오류를 발생시키는 이유는 무엇입니까?

다른 사람에게 유용 할 수 있지만 이해하려면 외부 단어를 입력해야합니다.

미리 감사드립니다.

답변

3

"고유 한 파일에서 전역"이라 함은 함수 외부에있는 "int x;"을 의미합니다. 검색하는 컴파일러 작업이 아니며 다른 컴파일 장치에서 필요로 할 경우 변수를 링커에서 사용할 수 있어야합니다 (예 : errno로).

링커에서 사용할 수없는 곳인 "static int x"을 의미하는 경우 이는 아마도 GCC가 선택한 것일뿐입니다. 나는 컴파일러가 이것을 알려주기 위해 이 필요하다고 생각하지 않으며 주소 공간에 몇 바이트를 낭비하는 것 이외의 실제적인 피해는 없다.

6

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

+0

하지만 보이게하려면 외부에 선언해야합니다. – Eduardo

+0

아니요, 기본적으로 표시됩니다. External은 다른 컴파일 단위에서 전역 변수를 찾기 위해 링커에 지시하는 데 사용됩니다. – Michael

+0

Nope - 다른 컴파일 유닛이 그렇게 할 수 있습니다. –

3

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

1

글로벌 인 경우 나중에 연결되는 다른 모듈에서 사용할 수 있기 때문에.

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

3

사용하지 않는 지역은 컴파일러에서 결정할 수 있습니다. 사용되지 않는 전역 변수는 링커가 객체 파일에서 공유 할 수 있기 때문에 링커 만 결정할 수 있습니다.

일반적으로 링커에서는 code-gen에 대한 경고를 표시하지 않습니다.

+0

일반적으로 링커가 사용하지 않는 전역 변수를 사용하면 이미지에서 제거됩니다. –

2

변수가 전역 변수 인 경우 컴파일러는 프로젝트의 모든 편집 단위에서 전체 가시성을 갖지 않습니다. 변수는 다른 컴파일 단위에서 수정할 수 있습니다. 링커는 그것이 사용되지 않는다고 말할 수 있습니다. 아마 그것은 객체 파일에서 그것을 제거 할 것입니다.

+0

나는 물건을 물건에서 지우는 alinker를 본 적이 없다. 최종 실행 파일에서 아마도. –

+0

죄송합니다. –

1

android2.3에서 dalvikVM을 빌드 할 때 동일한 질문이 발생했습니다.이 지점의 핵심이 있습니다. 컴파일러의 매개 변수가 너무 엄격하기 때문입니다 :

LOCAL_CFLAGS + = -Werror.

관련 문제