2011-08-01 2 views
2

main에서 프로그램 실행을 시작해야합니까? 아니면 시작 주소를 수정할 수 있습니까? in main 이전프로그램 실행은 항상 C의 main에서 시작합니까?

#include <stdio.h> 

void fun(); 

#pragma startup fun 

int main() 
{ 
    printf("in main"); 
    return 0; 
} 

void fun() 
{ 
    printf("in fun"); 
} 

이 프로그램은 인쇄 in fun.

+0

[어떻게하면 pragma startup preprocessor를 사용할 수 있습니까?] (http://stackoverflow.com/questions/5617005/how-do-you-use-pragma-startup-preprocessor) – Mat

답변

9

'#pragma'명령은 ANSI 표준에서 임의의 구현 정의 효과가 지정됩니다. GNU C 전처리 기에서 '#pragma'는 먼저 'rogue'게임을 실행하려고 시도합니다. 실패하면 게임 '해킹'을 실행하려고 시도합니다. 실패하면 GNU Emacs를 실행하여 하노이 탑을 표시합니다. 실패하면 치명적인 오류가 발생합니다. 어쨌든 전처리는 계속되지 않습니다.

- 리차드 스톨만은 GNU C 전 처리기, 버전 1.34

프로그램 실행은 시작 코드에서 시작, 또는 "런타임". 이것은 대개 컴파일러 패키지와 함께 제공되는 crt0.o 파일에있는 _start 또는 일부 (Unix 시스템의 경우)라는 어셈블러 루틴입니다. C 실행 파일 (예 : stdin, stdoutstderr)을 실행하는 데 필요한 설정은 atexit() ... atexit() ...로 사용되는 벡터이며 전역 개체 초기화, 즉 생성자 실행 등이 포함됩니다. 그런 다음에만 제어가 main()으로 점프합니다.

내 대답의 시작 부분에 인용문이 매우 설득력있게 표현되어 있기 때문에 #pragma은 완전히 귀하의 컴파일러에 달려 있습니다. 설명서를 확인하십시오.

+1

실제로 컴파일러 빌더가 갖고 싶습니다. 스톨만의 입장을 고수했다. 'pragma once' 나 소스 코드가 컴파일러 경고를 어렵게 만드는 것과 같은 멍청한 것들로부터 우리를 구해 냈을 것입니다 ... – DevSolar

0

C 프로그램은 반드시 main() 함수에서 시작되지 않는다 (... 첫 fun()를 호출하는 런타임을 알려줍니다 - - 방법에 의해 # 앞에 추가해야합니다 나는 당신의 pragma startup는 추측에는 요). 일부 코드는 main() 전에 실행되어 초기화되지 않은 모든 전역 변수를 제로화하고 다른 전역 변수를 적절한 값으로 초기화합니다. 위 ab 각각 main()에서 첫 번째 행의 실행 전에 010 할당되는 예시적인 코드에서

int a; 
int b = 10; 

int main() 
{ 
    int c = a * b; 
    return 0; 
} 

예를 들어, 다음의 코드를 고려한다.

#pragma 지시어는 구현 정의 동작을 정의합니다. #pragma 코드는 일부 컴파일러에서 컴파일 될 수 있지만 다른 컴파일러에서는 컴파일되지 않을 수 있습니다. 호스팅 구현에 대한 (일부 구현 정의 기능을 재정의하는 데 사용되지 않는)

+0

.data와 .bss 섹션의 설정이 시작 코드 대신 실행 가능한 로더에 의해 완료되지 않았습니까? – DevSolar

+0

@devsolar : 항상 그렇지 않을 수도 있습니다. 예를 들어 마이크로 컨트롤러 일 수 있습니다. 저는 OKI 411, OKI 431 및 PIC16F 마이크로에서 작업했습니다. 그들 모두에는 일종의 시작/런타임 코드가 있습니다. btw, 나는 이들이 typcially 때 PC에 프로그래밍 된 얻을 모르겠다. 나는'.data'와'.bss'라는 이름에 대해서만 들었습니다. 그들에 대해 많이 알지 못합니다. 좀 더 배울 수있는 링크를 좀주세요. – Donotalo

+0

기본 ELF 오브젝트 파일 레이아웃 : 섹션 .text는 머신 코드를 포함하고, .data는 초기화 데이터 (예제에서는'10')를 포함합니다. .bss는 "zero initialized"영역으로, 물론 실행 파일에 없거나 "size"숫자로만 사용됩니다. 충분한 zero-initialized 메모리를 제공하기 위해 그것을 로더에 남겨 둡니다. 물론 현실은 더 어렵습니다 (디버그 정보가 포함 된 섹션 또는 C++ 예외 처리 또는 그런 것들). Wikipedia, "데이터 세그먼트"를 확인하십시오. – DevSolar

1

는 지금까지 ISO C 표준에 관한 한, C 프로그램의 진입 점은 항상 main입니다. "독립 실행 형 구현"(일반적으로 운영 체제가없는 임베디드 시스템)의 경우 진입 점은 구현에 따라 정의됩니다.

관련 문제