int main ()과 int main (void)의 차이점은 무엇입니까?
다음은 무엇을 의미합니까?
int main(void) {...}
VS
int main() {...}
?
나는 그것이 int main() {...}
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);
}
아, 그리고 완성 void
하자면 모든 함수 선언자에서는 다음과 같은 의미를 갖습니다.
(6.7.6.3p10) 목록의 유일한 항목 인 void 유형의 명명되지 않은 매개 변수의 특별한 경우는 함수에 매개 변수가 없음을 지정합니다.
C에서 프로토 타입 (C ++이 아님)에서 빈 인수 목록은 함수가 모든 인수를 취할 수 있음을 의미합니다 (함수 정의에서 인수가 없음을 의미합니다). C ++에서 빈 매개 변수 목록은 인수가 없음을 의미합니다. C에서 인수를 얻지 않으려면 void
. 더 나은 설명 은 이 질문을 참조하십시오 .
C ++에서 기능을 갖는 foo(void)
하고하는 것은 foo()
같은 일이다. 그러나 C에서는 다릅니다. foo(void)
은 인수가없는 foo()
함수이고은 지정되지 않은 인수가있는 함수입니다.
C ++에서는 차이가 없으며 둘 다 동일합니다.
두 정의 모두 C에서도 작동하지만 void가있는 두 번째 정의는 main이 매개 변수없이 만 호출 될 수 있음을 명확하게 지정하므로 기술적으로 더 나은 것으로 간주됩니다. C에서 함수 시그니처가 인수를 지정하지 않으면 함수를 여러 매개 변수를 사용하거나 매개 변수없이 호출 할 수 있음을 의미합니다. 예를 들어, 다음 두 C 프로그램을 컴파일하고 실행 해보십시오 (파일을 .c로 저장해야 함).
우선, 여기에 표시된 것처럼 호스팅 된 시스템과 독립형 시스템에 허용되는 것의 차이가 있습니다 .
호스팅 된 시스템의 경우 5.1.2.2.1 프로그램 시작이 적용됩니다.
프로그램 시작시 호출되는 함수의 이름은 main입니다. 구현은이 함수에 대한 프로토 타입을 선언하지 않습니다. 반환 유형이 int이고 매개 변수없이 정의되어야합니다.
int main(void)
... (argv / argc 등 스타일에 관한 더 많은 텍스트가 이어집니다).
흥미로운 부분은 "매개 변수 없음"입니다. int main()
그리고 int main (void)
그들은 모두 함수 선언자이며, 매개 변수가 없기 때문에, 현재 동일합니다. 다음이 적용됩니다 (6.7.6.3) :
10 목록에있는 유일한 항목으로서 이름이 지정되지 않은 void 유형 매개 변수의 특별한 경우는 함수에 매개 변수가 없음을 지정합니다.
/-/
14 식별자 목록은 함수 매개 변수의 식별자 만 선언합니다. 함수 정의의 일부인 함수 선언자의 빈 목록은 함수에 매개 변수가 없음을 지정합니다. 해당 함수 정의의 일부가 아닌 함수 선언자의 빈 목록은 매개 변수의 수 또는 유형에 대한 정보가 제공되지 않음을 지정합니다 .145)
강조하면 굵은 텍스트는에 적용됩니다 int main()
. 또한 텍스트 끝에는 ""미래 언어 방향 "(6.11.6) 참조"라는 메모 145)가 있습니다.
6.11.6 함수 선언자
빈 괄호 (프로토 타입 형식 매개 변수 유형 선언자가 아님)가있는 함수 선언자를 사용하는 것은 더 이상 사용되지 않는 기능입니다.
And here is the difference. Being a function declarator, int main()
is bad style because of the above, since it is not guaranteed to work in the next version of the C standard. It is flagged as an obsolescent feature in C11.
You should therefore always use int main (void)
on a hosted system and never int main()
, even if the two forms are, for now, equivalent.
In C++ both forms are completely equivalent, but there int main()
is the preferred style for subjective, cosmetic reasons (Bjarne Stroustrup says so... which is probably quite a bad rationale for explaining why you do something in a particular way).
In C++, there is no difference between the two, and int main()
is a legal signature and return type for main
.
Function prototype having Type foo(void)
is absolutely same as Type foo()
, there is no difference between the two. Former may be used for readability.
As with main
- taking arguments or not, the program can still access command line information through other means like __argv
, __argc
, GetCommandLine
, or other platform/compiler specific symbols.
I know the thread is old but this question was bothering me for a while a few years ago so I wanted to throw in my half a cent(if that).
I always treat C functions as if they have fixed amount of arguments regardless of context, unless they use va_args. That is, I trust main to ALWAYS have the prototype:
int main(int argc, char **argv).
even if no arguments are passed, the function has these arguments on the stack because the main function does not have function overloading.
C does have the ability to have primitive overloading through just pretending the argument is not there. In which case, the argument is still passed and is on the stack but you never access it, so it merely reduces size of the source code.
Saying int main() simply means that I know that the function may have parameters, but I am not using them, so I write int main().
Saying int main(void) says that main CERTAINLY has no arguments, and implies that there are two different function prototypes:
int main(void);
int main(int argc, char **argv);
Since C has no function overloading, this is somewhat misleading to me, and I distrust code that has main(void) in it. I would not if main NEVER took any parameters, in which case main(void) would be completely OK.
NOTE: In some implementations, there are more parameters in main than argc and argv, such as env, but this does not bother me because I know that I do not explicitly say that those are the only two parameters, but those are the minimal parameters and it's okay to have more, but not less. This is in contrast to downright saying int main(void) which yells at me as THIS FUNCTION HAS NO PARAMETERS, which isn't true, since it does, they are just omitted.
Here is my basis code:
/* 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;
}
./sample I clearly have arguments
The function clearly has arguments passed to it, despite going out of the way to explicitly say that it doesn't by typing void into the function prototype.
As eq- says above:
(6.7.6.3p10) The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters.
Thus saying that the function has void as an argument but actually having arguments on the stack is a contradiction.
My point is that arguments are still there, so explicitly asserting that main is void of arguments is dishonest. The honest way would be to say int main(), which claims nothing about how many parameters it has, only how many parameters you are care about.
NOTE2: The _argc, _pargv are system dependent, to find your values you must find them out by running this program:
/* 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;
}
These values should remain correct for your specific system.
ReferenceURL : https://stackoverflow.com/questions/12225171/difference-between-int-main-and-int-mainvoid
'Programing' 카테고리의 다른 글
iOS 애플리케이션간에 키 체인 데이터를 공유하는 방법 (0) | 2021.01.08 |
---|---|
동일한 프로젝트에 대해 동시에 여러 git 브랜치를 볼 수 있습니까? (0) | 2021.01.08 |
$ resource에 전달 된 @id는 무엇입니까? (0) | 2021.01.08 |
Python에서 공유 축이있는 GridSpec (0) | 2021.01.08 |
Docker가 다른 Linux 배포판을 실행할 수있는 이유는 무엇입니까? (0) | 2021.01.08 |