2014-11-10 3 views
-1

함수를 호출해야 할 경우 main 함수 또는 main 함수를 중첩하여 호출해야합니다. 프로그램은 항상 main 함수에서 시작됩니다.main 함수를 호출하지 않고 함수를 호출 할 수 있습니까?

//fun1.c 
fun1(void){ 
/*Do something useful*/ 
return 0; 
} 

//main_fun.c 
main(void){ 
fun1(); 
return 0; 
} 

main 함수를 사용하고 싶지 않고 fun1을 직접 호출하려는 경우 어떻게해야합니까? 프로그램 카운터를 fun1 주소로 직접 지정하여 시작할 수 있도록 할 수 있습니까?

+6

왜 그렇게하고 싶습니까? – bitcell

+4

당신은 정말로 * 성취하려고 노력하고 있습니까? –

+3

거의 이상한 일을해서는 안되며 ... 당신의 기능을 호출하고 싶지 않다면하지 마십시오. 그것을 주석 처리하십시오. 또는 main.c를 연결하지 마십시오. 아니면'# ifdef' 컴파일러 스위치를 사용하십시오. – Lundin

답변

0

C99C11 다음 (n1570를 참조 실제로 연습에서 표준의 최신 초안) 표준 C 구현의 두 가지 종류를 정의하는이 (C syntax 위키 페이지를 참조하십시오

__attribute__((constructor)) 
fun1(void){ 
// ... 

그것은 여기에서 상세하게 설명 있어요).

  • 호스팅 구현 (리눅스, POSIX, 또는 아마도 Windows에서 예 코드 응용 프로그램 소프트웨어에 유용) 당신에게주는 standard C library (libc) - <stdlib.h>에서 malloc<stdio.h>에서 printf주는 등 등 ..., 그리고 귀하의 프로그램은 main 함수 (서명 int main(int, char**) 또는 단지 int main(void))를 정의해야합니다. 호스팅 된 구현에서 대부분의 함수는 main에서 간접적으로 호출됩니다. John Zwinck answered과 같이, 일부 컴파일러는 main 전에 호출 할 함수를 매우 특정한 구현 방식 (및 순서)으로 정의하는 방법을 제공합니다. libc은 일반적으로 구현에 따라 초기화가 필요하며 main은 실제로 구현 방법에 따라 crt0에서 호출됩니다.
  • 독립 실행 형 구현 (코드 시스템 커널 소프트웨어 또는 마이크로 컨트롤러의 내장 소프트웨어에 유용함)은 libc 전체를 제공하지 않으며 코드 실행 방법을 정의하지 않습니다. 이 경우 구현시 소프트웨어 실행 방법을 정의해야합니다. 실제로 코드에서 함수를 호출하려면 외부 (예 : 어셈블리) 코드가 필요합니다.

GCC 컴파일러는 당신에게 독립형 구현 (그렇지 않으면 호스팅) 구현 (까다로운 마법 방법으로 일부 표준 기능을 컴파일하도록 허용 된 호스트

공지 사항을 제공하기 위해 -ffreestanding 플래그를 받아들이는 당신 #include을 경우 그것들을 정의하는 표준 헤더). 예 : here을 참조하십시오.

공지 사항 또한 표준이 정의되는 방법 호스팅 구현 main 작업 (§5.1.2.2. 호스팅 환경 페이지 n1570 12). 특히 mainreturn의 부족이 과 같습니다 (표준 exit(3) 함수는 거의 main에서 돌아 오는 것처럼 프로그램을 종료합니다).

실제로 구현 관련 질문입니다.

관련 문제