IT박스

int main ()은 C ++에 대한 선언이 필요합니까?

itboxs 2020. 11. 26. 08:04
반응형

int main ()은 C ++에 대한 선언이 필요합니까?


C ++의 함수에 대해 읽을 때 함수를 호출하려면 선언이 필요하다는 것을 배웠습니다. 예를 들면 :

#include <iostream>

int main() {
  std::cout << "The result is " << sum(1, 2);
  return 0;
}

int sum(int x, int y) {
  return x + y;
}

함수에 대한 선언이 없기 때문에 오류를 반환합니다 sum.

main.cpp:4:36: error: use of undeclared identifier 'sum'
  std::cout << "The result is " << sum(1, 2);
                                   ^
1 error generated.

이 문제를 해결하기 위해 다음 선언을 추가합니다.

#include <iostream>

int sum(int x, int y); // declaration

int main() {
  std::cout << "The result is " << sum(1, 2);
  return 0;
}

int sum(int x, int y) {
  return x + y;
}

내 질문은 왜 우리가 main다른 함수에 대해 추가해야 하므로 함수 에 대한 선언을 추가하지 않는 것입니다 sum.


함수의 정의는 함수의 선언이기도합니다.

함수 선언의 목적은 컴파일러에 알리는 것입니다. 함수를 정의하지 않고 선언하면 정의하기가 불편한 곳에서 함수를 사용할 수 있습니다. 예를 들면 :

  • 함수가 (B)에서 정의 된 것 이외의 소스 파일 (A)에서 사용되는 경우, A에서 선언해야합니다 (보통 A가 포함하는 헤더를 통해 B.h).
  • 둘 이상의 함수가 서로를 호출 할 수 있다면 다른 함수보다 먼저 모든 함수를 정의 할 수 없습니다. 그 중 하나가 먼저 여야합니다. 따라서 선언이 먼저 제공되고 나중에 정의가 제공 될 수 있습니다.
  • 많은 사람들이 "상위 수준"루틴을 소스 파일에 먼저 배치하고 나중에 서브 루틴에 배치하는 것을 선호합니다. 이러한 "상위 레벨"루틴은 다양한 서브 루틴을 호출하기 때문에 서브 루틴을 더 일찍 선언해야합니다.

C ++에서 사용자 프로그램은 절대를 호출하지 main않으므로 정의 전에 선언 할 필요가 없습니다. (원하는 경우 하나를 제공 할 수 있습니다. main이와 관련하여 선언에 대해 특별한 것은 없습니다 .) C에서 프로그램은 main. 이 경우 호출 전에 선언이 표시되어야합니다.

참고 main를 호출하는 코드에 알려질 필요가 없습니다. 이것은 일반적으로 C ++ 런타임 시작 코드라고하는 특수 코드입니다. 링커는 적절한 링커 옵션을 사용하여 C ++ 프로그램을 링크 할 때 자동으로 해당 코드를 포함합니다. 코드가 어떤 언어로 작성 되든 main제대로 호출하기 위해 필요한 선언이 있습니다.


함수를 호출하려면 선언이 필요하다는 것을 배웠습니다.

과연. 함수는 호출되기 전에 선언되어야합니다.

main함수에 대한 선언을 추가하지 않는 이유는 무엇입니까?

글쎄, 당신은 main함수를 호출하지 않았습니다 . 사실, 당신은 전화를 안 main모두에서 1 , 그래서 선언 할 필요가 결코 main아무것도하기 전에.

기술적으로는 모든 정의도 선언이므로의 정의 mainmain.


각주 1 : C ++ 표준은 main프로그램 내에서 호출하는 것이 정의되지 않은 동작이라고 말합니다 .

이를 통해 C ++ 구현은 일반적으로를 호출하는 시작 코드의 후크에서 더 일찍 실행할 수없는 경우 주 맨 위에 특수한 한 번 실행 시작 코드를 넣을 수 있습니다 main. 일부 실제 구현은 실제로이를 수행합니다. 예를 들어 비정규는 0과 같은 일부 FPU 플래그를 설정하는 빠른 수학 함수를 호출합니다.

가상 구현에서 main을 호출하면 모든 정적 변수에 대한 생성자를 다시 실행 하거나 할당을 추적하기 위해 new/ delete사용하는 데이터 구조를 다시 초기화 하거나 프로그램의 기타 전체 손상 과 같은 재미있는 일이 발생할 수 있습니다 . 또는 전혀 문제를 일으키지 않을 수도 있습니다. 정의되지 않은 행동은 의미하지 않는다 모든 구현에 실패합니다.


함수를 호출하려는 경우 프로토 타입이 필요하지만 sum귀하의 경우 처럼 아직 사용할 수 없습니다 .

main자신에게 전화해서는 안되므로 프로토 타입이 필요하지 않습니다. 프로토 타입을 작성하는 것도 나쁜 생각입니다.


아니요, 컴파일러는에 대한 전방 선언이 필요하지 않습니다 main().

main() C ++의 특수 함수입니다.

main ()에 대해 기억해야 할 몇 가지 중요한 사항은 다음과 같습니다.

  1. 링커에서는 main()실행 가능한 프로그램을 만들 때 하나의 함수 만 있어야합니다 .
  2. 컴파일러는 다음 두 가지 형식 중 하나로 main () 함수를 예상합니다.
int main () { /* body */ } 
int main (int argc, char *argv[]) { /* body */ } 

body0 개 이상의 문은 어디에 있습니까?

추가로 허용되는 양식은 구현별로 다르며 함수가 호출 될 때 환경 변수 목록을 제공합니다.

int main (int argc, char* argv[], char *envp[]) { /* body */ }

The coder must provide the 'definition' of main using one of these acceptable forms, but the coder does not need to provide a declaration. The coded definiton is accepted by the compiler as the declaration of main().

  1. If no return statement is provided, the compiler will provide a return 0; as the last statement in the function body.

As an aside, there is sometimes confusion about whether a C++ program can make a call to main(). This is not recommended. The C++17 draft states that main() "shall not be used within a program." In other words, cannot be called from within a program. See e.g. Working Draft Standard for C++ Programming Language, dated "2017-03-21", Paragraph 6.6.1.3, page 66. I realize that some compilers support this (including mine), but the next version of the compiler could modify or remove that behavior as the standard uses the term "shall not".


It is illegal to call main from inside your program. That means the only thing that is going to call it is the runtime and the compiler/linker can handle setting that up.This means you do not need a prototype for main.


A definition of a function also implicitly declares it. If you need to reference a function before it is defined you need to declare it before you use it.

So writing the following is also valid:

int sum(int x, int y) {
  return x + y;
}

int main() {
  std::cout << "The result is " << sum(1, 2);
  return 0;
}

If you use a declaration in one file to make a function known to the compiler before it is defined, then its definition has to be known at linking time:

main.cpp

int sum(int x, int y);

int main() {
  std::cout << "The result is " << sum(1, 2);
  return 0;
}

sum.cpp

int sum(int x, int y) {
  return x + y;
}

Or sum could have its origin in a library, so you do not even compile it yourself.

The main function is not used/referenced in your code anywhere, so there is no need to add the declaration of main anywhere.

Before and after your main function the c++ library might execute some init and cleanup steps, and will call your main function. If that part of the library would be represented as c++ code then it would contain a declaration of int main() so that that it could be compiled. That code could look like this:

int main();

int __main() {
  __startup_runtime();

  main();

  __cleanup_runtime();
}

But then you again have the same problem with __main so at some point there is no c++ anymore and a certain function (main) just represents the entry point of your code.


Nope. You can't call it anyway.

You only need forward declarations for functions called before they are defined. You need external declarations (which look exactly like forward declarations on purpose) for functions defined in other files.

But you can't call main in C++ so you don't need one. This is because the C++ compiler is allowed to modify main to do global initialization.

[I looked at crt0.c and it does have a declaration for main but that's neither here nor there].

참고URL : https://stackoverflow.com/questions/55457704/does-int-main-need-a-declaration-on-c

반응형