객체 지향 언어 (C++)에서는 main()
전에 코드를 실행할 수 있습니다. 전역 객체 또는 클래스 정적 객체를 사용하고 생성자가 원하는 코드를 실행하도록합니다.main() 전에 코드 실행
C에서이 작업을 수행 할 수있는 방법이 있습니까? 나는 내가 해결하려고하는 어떤 특별한 문제가 없다, 나는 단지 궁금하다. 이것은 라이브러리를 자동으로 초기화하는 데 유용 할 수 있습니다.
객체 지향 언어 (C++)에서는 main()
전에 코드를 실행할 수 있습니다. 전역 객체 또는 클래스 정적 객체를 사용하고 생성자가 원하는 코드를 실행하도록합니다.main() 전에 코드 실행
C에서이 작업을 수행 할 수있는 방법이 있습니까? 나는 내가 해결하려고하는 어떤 특별한 문제가 없다, 나는 단지 궁금하다. 이것은 라이브러리를 자동으로 초기화하는 데 유용 할 수 있습니다.
__attribute__
을 사용하는 방법이 있지만 컴파일러에 따라 매우 다르며이를 사용하여 작성된 코드는 이 아니고 실제로 휴대 할 수있는입니다. 반면 C 언어는 시작 모듈/라이브러리를 제공하지 않습니다.
C에서 논리적으로 main()
은 OS에서 호출하는 첫 번째 함수입니다. 그러나 main()
을 호출하기 전에 OS는 start-up
모듈이라는 다른 함수를 호출하여 다양한 환경 변수를 설정하고 정적 변수를 초기화 (초기화되지 않음)하고 스택 프레임 (활성화 레코드)을 작성하고 스택 포인터를 스택 영역의 시작 부분으로 초기화합니다. main()
에 전화하기 전에해야 할 일.
위에서 언급 한 작업을 수행 할 OS가 없거나 최소 인 임베디드 시스템 용 코드를 작성하는 경우 컴파일러에 따라 이러한 옵션을 탐색해야합니다. GCC, Turbo-C 및 Microsoft C 컴파일러는 특정 하드웨어 기계 (예 : 8086 기계)에 코드를 추가 할 수있는 기능을 제공합니다.
IOW, 시작 모듈은 프로그래머를위한 모듈이 아닙니다.
틀린'main'은 OS가 호출하는 첫번째 함수가 아닙니다. [crt0] (https://en.wikipedia.org/wiki/Crt0)에 대해 들어 보셨습니까? '_start'는 항상'main' 전에 호출되며, Windows에서는'WinMain'도'main' 전에 호출됩니다. –
전역 변수는 초기화 할 수 있지만 이러한 초기화에서는 함수를 호출 할 수 없습니다.
아니, 당신은 C에서 그렇게 할 수 없다. 나는 C++에서도 실제로 "main()
전에 실행되는 코드"를 얻을 수 없다고 주장한다. 예, 스크립트에서 은 앞에 표시되고 main()
앞에 표시 될 수 있지만 프로그램이 실제로 시작되는 곳은 main()
입니다.
이제 값을 초기화 할 수 있습니다. 미리 설정 한 상태의 변수를 가질 수도 있지만 그와 같은 것은 아닙니다.
3.6.2/3 ("초기화 될 객체와 동일한 번역 단위에서 정의 된 함수 나 객체를 처음 사용하기 전에 발생해야합니다.),"main "과 동일한 TU에 이름 공간 범위가있는 객체는 'main' *은 같은 TU 내 함수이기 때문에'main'의 첫 번째 문장 앞에 초기화됩니다. 표준은'main'의 함수 본문 내부에서 다른 어떤 명령문보다 먼저 init 코드를 호출 할 것인지 또는 init을 수행 할 다른 함수가 있는지를 고려하지 않습니다. 구현 전에 main이 호출되기 전에 호출됩니다. –
gcc를 사용하면 생성자 함수 특성 (예 :
__attribute__ ((__constructor__))
void foo(void) {
...
}
이렇게하면 main보다 foo가 먼저 호출됩니다.
참고 : 다른 컴파일러에서는 이식 할 수 없습니다.
__attribute__ ((constructor))
으로 할 수 있습니다. 다음 예제를 gcc
과 clang
으로 테스트했습니다. 즉, 이 아니고 일부 언어입니다.
#include <stdio.h>
void __attribute__ ((constructor)) premain()
{
printf("premain()\n");
}
int main(int argc, char *argv[])
{
printf("main()\n");
return 0;
}
그것은은 다음을
$ ./test
premain()
main()
되지 않은 표준을 준수하는 방식으로,하지만 당신은 운영 체제가 바이너리 이미지를로드하고 응용 프로그램의 주요 함수를 호출 할 때 정말 무슨 일에 발굴한다 !
메인이 실행 된 후 "실행할"수있는 기능을 지정하는 방법이 있습니다.
또한, this 링크 및 C++에서 초기화의 다양한 유형에 대해를 따라 - 당신은 (주 전에 코드를 실행하는 데 유용 할 수)라고합니다 .
또한이 [link] (http://en.cppreference.com/w/cpp/language/initialization)와 C++의 다양한 초기화 유형을 따르십시오. main()이 실행되기 전에 코드를 실행하는 것이 유용 할 수 있습니다. 라는. –
질문은 C에서 main 전에 코드를 호출하는 것이 었습니다. main 또는 C++ 뒤에 코드를 호출하지 않았습니다. –
http://stackoverflow.com/questions/949890/how-can-i-perform-pre-main-in-ialization-in-cc-with-avr-gcc – stacker
@stacker - 참조하신 질문은 다음과 같습니다. Arduino 환경. 어쨌든 거기에 대한 답변이 도움이 될 수 있습니다. – mouviciel