main ()에 의해 반환 된 값을받는 사람은 누구입니까?


34

나는 컴퓨터에서 main()함수가 반환 한 값 이 운영 체제에 의해 수신 된다는 것을 알고 있습니다. 그러나 main()마이크로 컨트롤러 의 기능은 어떻게됩니까 ?


7
PIC 마이크로 컨트롤러에 C를 사용할 때는 항상 void main ()을 사용합니다. 마이크로 컨트롤러에 C 컴파일러를 사용할 때는 전혀 중요하지 않습니다. "main.c"를 실행하는 운영 체제가 없기 때문에. 해당 마이크로 컨트롤러에서 RTOS와 같은 것이 실행중인 경우 운영 체제는 "main.c"입니다.
abdullah kahraman

4
복제본은 아니지만 최소한 관련성이 있습니다 : electronics.stackexchange.com/q/30830/4950
PetPaulsen

1
시작 기능의 정의 방법은 일반적으로 사용자가 결정하지 않습니다. 사용중인 환경에 지원되는 시작 기능 양식이 문서화됩니다. 호스팅 C 구현은 main서로 다른 두 가지 서명 을 가진 두 가지 형식을 지원해야합니다 int. 독립형 C 구현을 사용하는 경우 해당 구현에 따라 시작 기능을 작성하는 방법이 결정됩니다. void반환 기능 이 반환되지 않기 때문에 반환 기능을 작성할 수 없습니다 . 행동을 반환하지 않는 함수의 다른 유형 전체 호출 규칙에 영향을 미친다.
Kaz

답변:


42

마이크로 컨트롤러에서는 main()실제로 종료 될 것으로 예상되지 않으며 동작이 정의되지 않은 경우 마이크로 컨트롤러에 대한 C 런타임을 작성한 사람에게 달려 있습니다. 나는 다음과 같은 시스템을 보았습니다.

  • 내재 된 루프 main()를 사용하여 종료되면 다시 호출됩니다.
  • main()종료 될 때 실행되는 간단한 "자기 점프"루프가 있어야 합니다.
  • 에 대한 호출 다음에 오는 나머지 코드 메모리를 간단히 실행하십시오 main(). 이것을 "잡초로 뛰어 들다"라고합니다.

에 의해 반환 된 값으로 실제로 아무것도하는 것을 본 적이 없습니다 main(). 이것이 실제로 관심이 있다면 시스템의 C 런타임 라이브러리의 소스 코드를 살펴보고 가능하면 수정해야합니다.


1
넌 날 이겼어 동기 성 +1
Adam Lawrence

9
분명히 리턴 값 main()을 갖도록 정의한 C 표준 int은 OS가없는 마이크로 컨트롤러를 염두에두고 설계되지 않았습니다. 따라서 이것은 지정되지 않은 동작이며 Dave가 나열한대로 C 런타임에 따라 모든 일이 발생할 수 있습니다.
ndim

4
운영체제가없는 마이크로 컨트롤러에서 실행 C는 자립 구현으로 간주 될 수 있고, C 표준도하는 독립형의 environent을 필요로하지 않는 main()훨씬 덜 반환 값을 정의합니다. 그것은 구현 자에게 달려 있습니다.
KutuluMike

2
@ndim-머리카락을 분할하는 void main( void )것은 구현 되지 않은 동작이 아닌 구현 정의 동작 입니다.
Andrew

1
@MichaelEdenfield : 그렇습니다. 그러나 C의 모든 코드는 함수 측면에서 정의되므로 C로 완전히 작성된 시스템을 가질 수는 없습니다 . C 함수를 호출 할 수 있도록 최소한의 환경을 설정하는 최소한의 어셈블리 언어 (또는 기타)가 있어야합니다. 이 함수의 가장 확실한 이름은 main()입니다.
Dave Tweed

5

일반적인 오해 / 신화는 int main표준에 의해 지정된 유일한 유효한 형식이라는 것입니다. 사실이 아닙니다.

C 표준은 호스팅 및 독립형의 두 가지 구현에 대해 설명합니다. 이 경우 "구현"은 컴파일러를 의미합니다. 호스팅 된 컴파일러는 특정 OS를 위해 컴파일되고 독립형 컴파일러는 특정 베어 메탈 애플리케이션을 위해 컴파일됩니다. RTOS의 경우에도 임베디드 시스템은 거의 항상 독립형 시스템입니다.

독립형 구현은에 대한 모든 형식을 사용할 수 있으며 main()main이라는 함수가 없어도됩니다. 가장 자주, 그들은 void main (void)아무것도 반환하는 것이 타당하지 않기 때문에 form을 사용합니다 .

여기서 알아야 할 중요한 점은 프로그래머 의 형태를 결정 하는 프로그래머 는 항상 컴파일러 라는 것 main()입니다.

독립형 구현 에서 반환 뭔가 main()매우 의문이다. 컴파일러를 만든 사람들이 실제로 표준을 읽는지 궁금해합니다.

자세한 내용은 여기를 참조하십시오 .


3

C 언어 표준은 구현 정의 된 변형을 허용하며 이는 void main( void )임베디드 시스템에서 일반적으로 나타나는 형식입니다. 단순히 반환되지 않을 것이기 때문입니다.

컴파일러 설정을 살펴보면 일반적으로 재설정 벡터에서 호출 된 코드의 부트 스트랩 스 니펫이 있는데, main ()을 호출하기 전에 몇 가지 기본 초기화 (예 : 초기화 값을 변수에 복사 포함)를 수행합니다.

이것은 또한 (보통) 무한 루프 내에 있거나 main()반환 되면 재설정을 수행 합니다


0

그것은 (다른 언급 된 답변과 마찬가지로) 툴 체인에 따라 다르지만 예를 들어 GCC에서 main다른 함수로 컴파일되므로 반환 값이 호출 규칙에 따라 저장됩니다 (ARM에서는 GCC가 아닌 권리를 사용하고 있습니다 .R0에 배치됩니다) 반품 직전).

AVR-GCC에서는 비슷하다고 생각하므로 사용자 정의 스크립트는 메인 리턴 후에이 값을 사용할 수 있습니다.


이것은 오히려 포인트를 벗어났습니다
크리스 스트래튼에게

전화하는 사람 main이 반환 가치를 얻을 수 있다고 강조합니다 . 물론 99.9 % 상황에서는 무시되지만 응답은이 반환 값을받을 수있는 정보를 제공합니다.
kwesolowski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.