2014-01-17 3 views
4

이 코드를 실행 한 후 :주 변수 뒤에 선언 된 변수가 파일 범위를 가질 수 있습니까?

#include <stdio.h> 
int x; 
int main(void) 
{ 
    printf("%d\n",x); 
    return 0; 
} 
int x=5; 

I 출력이 0해야 기대했다. 시퀀스 제어 구조로 인해 int x; 프로그램의이 먼저 실행되고 0이 인쇄되고 마지막으로 int x=5;이 실행되어야합니다. 그러나 출력은 5입니다.

에 대해 프로그램이 5에 액세스하는 방법은 printf입니까?

+2

이 오류가 발생하는 동안 C2086 : 'int x': redefinition '. 먼저'int x'를'extern int x'로 변경해야합니다. – herohuyongtao

+0

그러나 GCC 4.8.1에서'-Wall -Wextra -pedantic -g3 -std = c99'로 컴파일합니다. – haccks

답변

7

첫 번째 매개 변수는 전달 선언으로 사용되며 나중에는 실제 정의로 사용됩니다.

+0

명령문이 순차적으로 실행되지 않고 '0'(전역 변수가 '0'으로 설정 됨)을 출력해야합니까? 질문을 수정했습니다. – haccks

+1

@haccks 전역 또는 정적 변수의 초기화는 모두'main'이 호출되기 전에 잘 수행됩니다. 실제로 컴파일러가 컴파일하는 동안 이미 값을 설정할 수도 있으므로 실행 파일이 메모리에로드 될 때 이미 설정되어 있습니다. –

+0

@haccks 그건 그렇고, 이것은 개체 및 실행 파일의 "데이터"세그먼트에 대한 귀하의 변수와 같은 초기화 된 데이터를 저장하는 것입니다. 초기화되지 않은 데이터 (예 : 변수'x'를 초기화하지 않은 경우)는 "bss"세그먼트로 끝나고, 이는 main 코드가 호출되기 전에 0으로 설정됩니다. –

3

함수 밖에서 선언 된 변수의 기본값은 main이 실행되기 전에 설정됩니다. 그래서 당신이보고있는 것은 올바른 행동입니다. 다른 소스 파일에서 선언 된 변수에도 동일하게 적용됩니다.

3

전역 변수는 main() 실행 전에 초기화됩니다. 즉, 파일에서 볼 수있는 한 (예 : 앞으로 선언 된) 함수의 전후에 나타나는 항목에 함수가 액세스하는 것은 전적으로 가능합니다.

그런데 실제로는 한 파일에서 같은 변수에 대해 여러 개의 선언을해서는 안됩니다. 실제로 초기화 된 내용과 위치에 대해 (주로 프로그래머에게) 혼동을 줄 수 있습니다.

편집 : 전역 범위의 함수/변수는 함수 내부에서 일련의 명령문처럼 실행되지 않습니다. 함수의 선언/정의의 위치는 다른 코드와 관련하여 호출 될 때 전혀 영향을 미치지 않습니다. 주변 범위의 어떤 부분을 볼 수 있는지 만 결정합니다. 귀하의 경우, 이것은 main()이 두 개의 int 행 사이에서 호출되지 않음을 의미합니다. 다른 모든 초기화가 완료되면 런타임에 의해 호출됩니다.

+0

질문에 대한 게시물을보다 명확하게 편집했습니다. – haccks

+0

@ haccks : 질문에 대한 답변을 좀 더 잘 편집했습니다. –

+0

좋습니다. 그러나 두 개의'int' 라인 사이에서'main'이 호출되지 않는지 궁금합니다! – haccks