C ++에서 main () 내부에 아무것도 선언하지 않고 컴파일 후 작동하는 응용 프로그램을 갖는 방법은 무엇입니까? 나는 다음과 같은 질문에 직면했습니다.

인터뷰에서 나는 다음과 같은 질문에 직면했습니다.

친구가 콘솔에 피보나치 수를 인쇄하는 단일 소스 코드 파일을 제공했습니다. main () 블록은 비어 있고 내부에 명령문이 없습니다.

이것이 어떻게 가능한지 설명하십시오 (힌트 : 글로벌 인스턴스!)

나는 이것에 대해 정말로 알고 싶습니다. 어떻게 그런 일이 가능할 수 있는지!



답변

다음과 같이 구현 될 가능성이 높습니다.

 void print_fibs()
 {
       //implementation
 }

 int ignore = (print_fibs(), 0);

 int main() {}

이 코드에서 전역 변수 ignoremain()함수에 들어가기 전에 초기화되어야 합니다. 이제 전역을 초기화하려면 print_fibs()무엇이든 할 수있는 곳에서 실행해야합니다.이 경우에는 피보나치 수를 계산하고 인쇄합니다! 나는 다음 질문에서 비슷한 것을 보여주었습니다.

이러한 코드는 안전하지 않으며 일반적으로 피하는 것이 가장 좋습니다. 예를 들어 std::cout객체 print_fibs()가 실행될 때 초기화되지 않을 수 있습니다. 그렇다면 std::cout함수에서 무엇을할까요? 그러나 다른 상황에서 이러한 초기화 순서에 의존하지 않는 경우 초기화 함수를 호출하는 것이 안전합니다 (C 및 C ++에서 일반적으로 사용됨).


답변

도움이 되었기를 바랍니다

class cls
{
  public:
    cls()
    {
      // Your code for fibonacci series
    }
} objCls;

int main()
{
}

따라서 클래스의 전역 변수가 선언 되 자마자 생성자가 호출되고 여기에 피보나치 시리즈를 출력하는 논리를 추가합니다.


답변

네 가능합니다. 객체 생성자에서 피보나치 수를 계산하는 객체의 전역 인스턴스를 선언해야합니다.


답변

나는 당신이 말하는 것과 같은 몇 가지 예를 알고 있습니다. 그것을 얻는 한 가지 방법은 템플릿 메타 프로그래밍을 사용하는 것입니다. 이를 사용하여 일부 컴퓨팅 프로세스를 컴파일로 이동할 수 있습니다.

여기 에서 피보나치 수에 대한 예를 얻을 수 있습니다.

정적 클래스 생성자에서 사용하고 주 함수에 코드를 작성할 필요없이 숫자를 작성할 수 있습니다.

도움이 되었기를 바랍니다.


답변

전역 / 정적 변수를 초기화하는 동안 상황이 발생할 수 있습니다. 코드는 응용 프로그램 시작시 트리거됩니다.


답변

파일 범위 객체에 대한 모든 [*] 생성자는 객체가 main아닌 파일 범위 변수에 대한 모든 이니셜 라이저 표현식과 마찬가지로 에 도달하기 전에 호출 됩니다.

편집 : 또한 모든 파일 범위 개체에 대한 all [*] 소멸자는 main종료 후 생성의 역순으로 호출 됩니다. 이론적으로 피보나치 프로그램을 객체의 소멸자에 넣을 수 있습니다.

[*] ‘all’은 프로그램이 직접 연결되지 않은 라이브러리를 동적으로로드 및 언로드하는 동작을 무시합니다. 기술적으로는 기본 C ++ 언어 밖에 있습니다.


답변