int main()과 int main(void)의 차이는 무엇입니까?
다음 의미는 무엇입니까?
int main(void) {...}
대
int main() {...}
?
는 ★★★★★★★★★★★★★★★★★★★★★★★★」int main() {...}
에는 (하지 않는 다음과 같습니다.
int main(int argc, char *argv[])
한다.
이 말은 요?int main(void) {...}
무슨 뜻이죠? 그리고 보이드는 무엇의 약자죠?
여기 찾아봤는데 뭔가 다른 질문이네요.
C++에서는 차이가 없습니다.
C에서는 차이가 의심스럽다. 버전(후자 이 없는 버전)을를 좋아한다.void
)는 기술적으로 일반적인 구현 확장일 뿐이며, 표준에 기재되어 있기 때문에 표준으로 동작하는 것을 보증하지 않습니다.그러나 이 표준은 함수 정의에서 빈 매개변수 집합이 잘 정의된 동작을 갖는다는 것을 명확히 명시하고 있습니다. 즉, 함수는 어떤 매개 변수도 취하지 않습니다.따라서 주(main)에 대한 이러한 정의는 표준의 다음 설명과 일치한다.
[main]은 파라미터 없이 리턴 타입 int로 정의해야 한다.
에는 현저한 ,, 이, 이, 이, 이, 이, 이, 이, 이, 이가 없는 버전입니다.void
기능에 대한 올바른 프로토타입을 제공하지 못합니다.
// this is OK.
int main()
{
if (0) main(42);
}
// this requires a diagnostic to be shown during compiling
int main(void)
{
if (0) main(42);
}
그리고 , oh, 리, 리, 리, 리, oh, oh, oh, oh, oh, oh, oh, oh.void
에는 모든 함수 선언자의 다음 의미가 있습니다.
(6.7.6.3p10) 목록에서 유일한 항목으로서 void 형식의 이름 없는 매개변수의 특별한 경우는 함수에 매개변수가 없음을 명시한다.
우선, 다음과 같이 호스트 시스템과 프리랜딩 시스템에서 허용되는 것의 차이가 있습니다.
호스트 시스템의 경우 5.1.2.1 프로그램 시작이 적용됩니다.
프로그램 시작 시 호출되는 함수의 이름은 main입니다.구현에서 이 함수에 대한 프로토타입이 없음을 선언합니다.이 값은 int의 반환 유형으로 정의해야 하며 매개 변수는 없습니다.
int main(void)
...(argv/argc 등의 스타일에 대한 자세한 내용은 뒤에 있습니다).
을 사용하다 int main()
★★★★★★★★★★★★★★★★★」int main (void)
는 모두 함수 선언자이며 파라미터가 없기 때문에 현재 동등합니다.이 적용됩니다(
10 목록의 유일한 항목으로서 void 유형의 이름 없는 매개변수의 특별한 경우 함수에 매개변수가 없음을 명시합니다.
/--/
14 식별자 리스트는 함수 파라미터의 식별자만을 선언한다.함수 정의의 일부인 함수 선언자의 빈 목록은 함수에 매개 변수가 없음을 나타냅니다.함수 정의의 일부가 아닌 함수 선언자의 빈 목록은 파라미터의 수 또는 유형에 대한 정보를 제공하지 않도록 지정합니다.145).
하는 글씨입니다. 굵은 글씨로 표시된 것은int main()
본문 끝에는 "미래 언어 지침" 참조(6.11.6)라는 주석도 있습니다.
6.11.6 함수 선언자
빈 괄호(프로토타입 형식의 파라미터 타입 선언자가 아님)에 함수 선언자를 사용하는 것은 사춘기적인 기능입니다.
그리고 여기 차이점이 있습니다. 「」는 「」입니다.int main()
C규격의 다음 버전에서는 동작하지 않을 것이기 때문에 위의 이유로 불량한 스타일입니다.C11에서는 사춘기 기능으로 플래그가 붙어 있습니다.
에 항상 사용하셔야 .int main (void)
하며, "Never"는 "Never " 。int main()
현재로선 두 형태가 동일하더라도.
에서는 두 하지만, C++에서는 형식이 됩니다.int main()
주관적이고 외관적인 이유로 선호되는 스타일이다(Bjarne Stroustrup이 그렇게 말한다)특정 방법으로 무엇인가를 하는 이유를 설명하는 데는 아마도 좋지 않은 근거일 것입니다).
C에서 (C++는 아니지만) 프로토타입에서 빈 인수 목록은 함수가 어떤 인수도 받아들일 수 있음을 의미합니다(함수의 정의에서는 인수가 없음을 의미합니다).C++에서는 빈 파라미터 리스트는 인수가 없음을 의미합니다.C에서 인수를 얻지 않으려면 다음을 사용해야 합니다.void
자세한 설명은 이 질문을 참조하십시오.
함수를 가진 C++에서foo(void)
그리고.foo()
똑같아요.단, C에서는 다릅니다.foo(void)
는 인수가 없는 함수입니다.foo()
는 인수가 지정되지 않은 함수입니다.
C++에서는 차이가 없습니다.둘 다 동일합니다.
두 가지 정의 모두 C에서도 작동하지만, void를 포함한 두 번째 정의는 매개 변수 없이 메인만 호출할 수 있음을 명확히 규정하기 때문에 기술적으로 더 나은 것으로 간주됩니다.C에서는 함수 시그니처에 인수가 지정되어 있지 않은 경우, 임의의 수의 파라미터로 함수를 호출할 수도 있고 파라미터 없이 호출할 수도 있습니다.예를 들어, 2개의 C 프로그램을 컴파일 해 실행해 보겠습니다(파일은 .c로 저장해 주세요).
C++에서는 이 두 가지 사이에 차이가 없습니다.int main()
의 법적 서명 및 반환 유형입니다.main
.
실타래가 오래됐다는 건 알지만 몇 년 전만 해도 이 질문이 마음에 걸려 반 푼이라도 기부하고 싶었다.
C 함수는 va_args를 사용하지 않는 한 문맥에 관계없이 항상 일정한 양의 인수가 있는 것처럼 취급합니다.즉, Main은 항상 프로토타입을 가지고 있을 것입니다.
int main(int argc, char **argv).
인수가 전달되지 않더라도 메인 함수에 함수 오버로드가 없기 때문에 함수는 스택에 이러한 인수를 가집니다.
C는 인수가 없는 척하는 것만으로 원시적인 오버로드가 발생할 수 있습니다.이 경우 인수는 계속 전달되어 스택에 존재하지만 액세스하지 않기 때문에 소스 코드의 크기만 줄일 수 있습니다.
int main()이라고 하는 것은 단순히 함수에 파라미터가 있을 수 있다는 것을 알고 있지만 사용하지 않기 때문에 int main()이라고 씁니다.
int main(void)을 말하는 것은 main이 확실히 논쟁의 여지가 없음을 의미하며, 두 가지 다른 기능 프로토타입이 있음을 의미합니다.
int main(void);
int main(int argc, char **argv);
C는 함수 오버로드가 없기 때문에 다소 오해의 소지가 있어 메인(void)이 들어간 코드를 믿지 않습니다.메인(void)이 완전히 정상인 경우, 메인(void)이 아무런 매개 변수도 취하지 않았다면 사용하지 않았을 것입니다.
메모: env와 같이 argc와 argv보다 많은 파라미터가 실장되어 있는 경우도 있습니다만, 이러한 파라미터가 유일한 파라미터라고 명시적으로 말하는 것은 아니지만 최소 파라미터이며, 그 이상의 파라미터는 있어도 상관없습니다.이 함수는 파라미터가 없다고 int main(void)을 바로 말하는 것과는 대조적인 것으로, 이 함수는 파라미터가 없기 때문에 생략되어 버립니다.
기본 코드는 다음과 같습니다.
/* sample.c - build into sample. */
#include <stdio.h>
int main(void)
{
int _argc = *((int *)2686800);
char ***_pargv = (char ***)2686804;
int i;
for (i = 1; i < _argc; ++i) {
printf("%s ", (*_pargv)[i]);
}
return 0;
}
/샘플 나는 분명히 말다툼이 있다.
함수 프로토타입에 void를 입력함으로써 아니라고 명시적으로 말하는데도 함수에는 분명히 논점이 전달되어 있습니다.
위에서 설명한 바와 같이:
(6.7.6.3p10) 목록에서 유일한 항목으로서 void 형식의 이름 없는 매개변수의 특별한 경우는 함수에 매개변수가 없음을 명시한다.
따라서 함수는 인수로서 무효이지만 실제로는 스택에 인수가 있다고 하는 것은 모순입니다.
내 요점은 논쟁은 여전히 존재하기 때문에, 논쟁의 주체가 없다고 명시적으로 주장하는 것은 부정직하다는 것이다.솔직한 방법은 int main()이라고 하는 것입니다.int main()은 파라미터의 개수와 관련된 파라미터의 개수에 대해 아무것도 주장하지 않습니다.
메모 2: _argc, _pargv는 시스템에 따라 다르므로 값을 찾으려면 이 프로그램을 실행하여 값을 찾아야 합니다.
/* findargs.c */
#include <stdio.h>
int main(int argc, char **argv)
{
printf("address of argc is %u.\n", &argc);
printf("address of argv is %u.\n", &argv);
return 0;
}
이러한 값은 특정 시스템에 대해 올바른 상태로 유지됩니다.
C++에서는 int main()과 int main(void)의 차이는 없습니다.
하지만 C에서는 그들은 조금 다르다.
int main()은 메인 함수가 임의의 수의 파라미터로 호출되거나 파라미터 없이 호출될 수 있음을 나타냅니다.한편 int main(void)은 파라미터 없이 메인함수가 호출됨을 나타냅니다.
#include <stdio.h>
int main()
{
static int i = 5;
if (--i){
printf("%d ", i);
main(10);
}
}
출력: 4 3 2 1
#include <stdio.h>
int main(void)
{
static int i = 5;
if (--i){
printf("%d ", i);
main(10);
}
}
에러가 표시됩니다.왜냐하면...
int main(void)
파라미터는 무효이지만 프로그램에서 취득했습니다.main(10)
(그것은 무효가 아닌 일부 가치를 정의한다.)
엄밀히 말하면, 호스트가 부분적으로 POSIX에 준거하고 있는 경우는,
int main(); // this legacy is always used by the run time library
int main(int argc); // illegal by compiler
int main(int argc, char** argv); // required by C standards
int main(int argc, char** argv, char** envp); // required by POSIX standard
Mac을 가지고 계신 분들은 이것 또한 있습니다.
int main(int argc, char** argv, char** envp, char** apple); // required by Macintosh standard
호스트는 모든 인수를 전송하기 때문에 호스트는 항상 argc, argv 및 envp(애플 제품을 사용하는 경우 애플도 포함)를 전송하지만 프로그래머는 이러한 인수를 가질 수 있습니다.main
무효로 선언되었습니다.암묵적인 함수 포인터 타입캐스트는 기술적으로 정의되지 않은 동작입니다.
typecast 정의되지 않은 동작을 방지하려면int main()
는 표준형 프로모션(int 이상, 2배 이상)을 사용하여 임의의 수의 인수를 사용할 수 있음을 의미하는 중립 형식입니다.int main(int argc, ...)
표준형 프로모션에서도 임의의 수의 변수를 사용할 수 있습니다.즉, 폼은return_type function_name()
는 정의되지 않은 동작의 예외입니다.
C++의 경우:
ㅤㅤint main()
그리고.int main(void)
C++에서도 동일합니다.둘 다 0 파라미터와 0 파라미터만 사용합니다.
C:
ㅤㅤint main()
원하는 만큼 많은 인수를 사용합니다.함수는 그것들을 사용하지 않을 것이다. int
ㅤㅤㅤmain(void)
인수를 전달하면 오류가 발생하여 인수를 전달할 수 없게 됩니다.
ㅤ
언급URL : https://stackoverflow.com/questions/12225171/difference-between-int-main-and-int-mainvoid
'source' 카테고리의 다른 글
vuejs 재귀적 단일 파일 구성 요소 (0) | 2022.08.28 |
---|---|
파이어베이스에서 데이터 로드가 완료될 때까지 대기(vue)/'대기'가 작동하지 않음 (0) | 2022.08.28 |
Vue.js 2.Axios 인터셉터에서 Vuex를 사용하는 방법 (0) | 2022.08.28 |
수평 스크롤바가 없는 vue-multiselect 드롭다운리스트 (0) | 2022.08.28 |
행렬 곱셈: 행렬 크기가 작거나 타이밍 차이가 큽니다. (0) | 2022.08.28 |