2012-01-03 6 views
20

객체 지향 언어 (C++)에서는 main() 전에 코드를 실행할 수 있습니다. 전역 객체 또는 클래스 정적 객체를 사용하고 생성자가 원하는 코드를 실행하도록합니다.main() 전에 코드 실행

C에서이 작업을 수행 할 수있는 방법이 있습니까? 나는 내가 해결하려고하는 어떤 특별한 문제가 없다, 나는 단지 궁금하다. 이것은 라이브러리를 자동으로 초기화하는 데 유용 할 수 있습니다.

+0

http://stackoverflow.com/questions/949890/how-can-i-perform-pre-main-in-ialization-in-cc-with-avr-gcc – stacker

+0

@stacker - 참조하신 질문은 다음과 같습니다. Arduino 환경. 어쨌든 거기에 대한 답변이 도움이 될 수 있습니다. – mouviciel

답변

10

__attribute__을 사용하는 방법이 있지만 컴파일러에 따라 매우 다르며이를 사용하여 작성된 코드는 이 아니고 실제로 휴대 할 수있는입니다. 반면 C 언어는 시작 모듈/라이브러리를 제공하지 않습니다.

C에서 논리적으로 main()은 OS에서 호출하는 첫 번째 함수입니다. 그러나 main()을 호출하기 전에 OS는 start-up 모듈이라는 다른 함수를 호출하여 다양한 환경 변수를 설정하고 정적 변수를 초기화 (초기화되지 않음)하고 스택 프레임 (활성화 레코드)을 작성하고 스택 포인터를 스택 영역의 시작 부분으로 초기화합니다. main()에 전화하기 전에해야 할 일.

위에서 언급 한 작업을 수행 할 OS가 없거나 최소 인 임베디드 시스템 용 코드를 작성하는 경우 컴파일러에 따라 이러한 옵션을 탐색해야합니다. GCC, Turbo-C 및 Microsoft C 컴파일러는 특정 하드웨어 기계 (예 : 8086 기계)에 코드를 추가 할 수있는 기능을 제공합니다.

IOW, 시작 모듈은 프로그래머를위한 모듈이 아닙니다.

+0

틀린'main'은 OS가 호출하는 첫번째 함수가 아닙니다. [crt0] (https://en.wikipedia.org/wiki/Crt0)에 대해 들어 보셨습니까? '_start'는 항상'main' 전에 호출되며, Windows에서는'WinMain'도'main' 전에 호출됩니다. –

0

전역 변수는 초기화 할 수 있지만 이러한 초기화에서는 함수를 호출 할 수 없습니다.

1

아니, 당신은 C에서 그렇게 할 수 없다. 나는 C++에서도 실제로 "main() 전에 실행되는 코드"를 얻을 수 없다고 주장한다. 예, 스크립트에서 앞에 표시되고 main() 앞에 표시 될 수 있지만 프로그램이 실제로 시작되는 곳은 main()입니다.

이제 값을 초기화 할 수 있습니다. 미리 설정 한 상태의 변수를 가질 수도 있지만 그와 같은 것은 아닙니다.

+3

3.6.2/3 ("초기화 될 객체와 동일한 번역 단위에서 정의 된 함수 나 객체를 처음 사용하기 전에 발생해야합니다.),"main "과 동일한 TU에 이름 공간 범위가있는 객체는 'main' *은 같은 TU 내 함수이기 때문에'main'의 첫 번째 문장 앞에 초기화됩니다. 표준은'main'의 함수 본문 내부에서 다른 어떤 명령문보다 먼저 init 코드를 호출 할 것인지 또는 init을 수행 할 다른 함수가 있는지를 고려하지 않습니다. 구현 전에 main이 호출되기 전에 호출됩니다. –

4

gcc를 사용하면 생성자 함수 특성 (예 :

__attribute__ ((__constructor__)) 
void foo(void) { 
     ... 
} 

이렇게하면 main보다 foo가 먼저 호출됩니다.

참고 : 다른 컴파일러에서는 이식 할 수 없습니다.

13

__attribute__ ((constructor))으로 할 수 있습니다. 다음 예제를 gccclang으로 테스트했습니다. 즉, 이 아니고 일부 언어입니다.

#include <stdio.h> 

void __attribute__ ((constructor)) premain() 
{ 
    printf("premain()\n"); 
} 

int main(int argc, char *argv[]) 
{ 
    printf("main()\n"); 
    return 0; 
} 

그것은은 다음을

$ ./test 
premain() 
main() 
0

되지 않은 표준을 준수하는 방식으로,하지만 당신은 운영 체제가 바이너리 이미지를로드하고 응용 프로그램의 주요 함수를 호출 할 때 정말 무슨 일에 발굴한다 !

0

메인이 실행 된 후 "실행할"수있는 기능을 지정하는 방법이 있습니다.

  1. atexit()

  2. at_quick_exit()

또한, this 링크 및 C++에서 초기화의 다양한 유형에 대해를 따라 - 당신은 (주 전에 코드를 실행하는 데 유용 할 수)라고합니다 .

+0

또한이 [link] (http://en.cppreference.com/w/cpp/language/initialization)와 C++의 다양한 초기화 유형을 따르십시오. main()이 실행되기 전에 코드를 실행하는 것이 유용 할 수 있습니다. 라는. –

+0

질문은 C에서 main 전에 코드를 호출하는 것이 었습니다. main 또는 C++ 뒤에 코드를 호출하지 않았습니다. –

관련 문제