2015-02-04 2 views
3

나는 몇 가지 질문을 겪고 있었고 이것이 stackoverflow 덕분에 이해할 수있는 선언과 정의에 대한 질문을했지만 이것이 하나라는 것을 알았습니다. C의 프로그램 흐름

int main() 
{ 
extern int a; 
printf("%d",a); 
} 
int a=20; 
INT 상기 코드 통근에 그래서, 어떤 제어 명령이 발생하지 않는 경우 C 프로그램 실행의 흐름은 위에서 아래로이다

잠시 INT의 A = 20가 정의 선언 하지만이 문장은 main()이 끝난 후에도 프로그램이 끝난 결과입니다. 그렇다면이 코드가 어떤 오류도주지 않는 이유는 무엇입니까? Undefined symbol a?

+0

짧은 대답 : C는 스크립팅 언어가 아니고 컴파일 된 언어입니다. 이해하기 위해서는 C 컴파일러가 생성하는 어셈블리 코드와 링커가 모든 것을 하나로 묶어 실행 파일로 묶을 수 있도록하는 개체 파일 형식을 살펴볼 필요가 있습니다. – user3386109

답변

4

마지막 int a=20;은 진술이 아니고 정의입니다. 따라서 변수 a은 프로그램 시작 전에 초기화됩니다.

main 내부 extern int a;일부 전역 심볼의 선언 (인 (AN ELF 실행 파일을 실행하는 리눅스 시스템에서, a은 프로그램의 execve(2)시에 초기화, 일부 data 부문에서 아마) 귀하의 경우에는 나중에 정의 된 변수 a이됩니다).

다른 번역 단위로 int a=20;을 넣고 두 가지를 모두 연결하여 프로그램을 만들 수 있습니다.

읽기 Levine's book on linkers and loaders

+0

** extern int는 내부 메인이 일부 전역 심볼의 선언입니다 ** 동일한 변수 a의 선언이 아닌가요? –