C의 main() 함수에 유효한 시그니처는 무엇입니까?
C의 주요 기능에 유효한 시그니처는 무엇입니까?알고 있습니다.
int main(int argc, char *argv[])
다른 유효한 것이 있습니까?
C11
standard에서는 다음 두 가지를 명시적으로 언급하고 있습니다.
int main(void);
int main(int argc, char* argv[]);
단, 다음 각주와 함께 "또는 동등한" 문구를 언급하고 있습니다.
thus따는
int
로 할 수typedef
""로 "int
「」의 .argv
라고 쓸 수char ** argv
기타 등등.
또한 더 많은 (실장 정의) 가능성도 제공합니다.
텍스트(섹션)5.1.2.2.1
, 이 은 " ", "에서 되지 않습니다C99
에러:
시은 "예"입니다.
main
구현에서는 이 함수에 대한 프로토타입이 없음을 선언합니다.은 「돌아가다」로해야 합니다.int
다음 중 하나:int main(void) { /* ... */ }
2개의 서는 「2」로 를합니다.
argc
★★★★★★★★★★★★★★★★★」argv
수 이기 때문에 할 수 있습니다 : , 、 , 、 의 、 의 、 의 、 의 、 임 , , , , , 。이는 선언된 함수의 로컬이기 때문입니다).int main(int argc, char *argv[]) { /* ... */ }
또는 동등한 것, 또는 다른 구현 정의 방식.
에
main
기능은 다음과 같은 제약을 준수해야 한다.
「」의 값
argc
음이 아니어야 한다.
argv[argc]
.「」의
argc
멤버 0이 되다( 멤버는 0입니다.argv[0]
through를 통해.argv[argc-1]
에는 스트링에 이러한 시작에 의해 이 부여됩니다.목적은 호스트 환경의 다른 곳에서 프로그램을 시작하기 전에 결정된 프로그램 정보를 제공하는 것입니다.호스트 환경에서 대문자와 소문자 모두로 된 문자열을 제공할 수 없는 경우, 구현에서는 문자열이 소문자로 수신되도록 해야 합니다.「」의
argc
0이 입니다.argv[0]
. 프로그램 이름:argv[0][0]
호스트 환경에서 프로그램 이름을 사용할 수 없는 경우 null 문자가 됩니다.「」의argc
, 1을 , 1을 가리키다, 1을 가리키다, 을 가리키다.argv[1]
through를 통해.argv[argc-1]
프로그램 파라미터를 나타냅니다.'''
argc
★★★★★★★★★★★★★★★★★」argv
.argv
어레이는 프로그램에 의해 수정이 가능해야 하며 프로그램 시작과 프로그램 종료 사이에 마지막 값을 유지해야 합니다.
이는 C 프로그램에서 일반적으로 볼 수 있는 호스트 환경용입니다..5.1.2.1
다음 중 하나:
프리랜딩 환경(운영체제의 이점 없이 C 프로그램 실행이 이루어질 수 있음)에서는 프로그램 부팅 시 호출되는 함수의 이름과 유형이 구현 정의됩니다.프리스탠딩 프로그램에 이용 가능한 라이브러리 설비는 조항 4에 의해 요구되는 최소 세트를 제외하고 구현 정의된다.
표준 C
호스트 환경(일반 환경)의 경우 C99 표준에는 다음과 같이 기술되어 있습니다.
5.1.2.1 프로그램 부팅
시은 "예"입니다.
main
구현에서는 이 함수에 대한 프로토타입이 없음을 선언합니다.은 「돌아가다」로해야 합니다.int
파라미터 없음:int main(void) { /* ... */ }
또는 2개의 파라미터(여기에서는
argc
그리고.argv
단, 임의의 이름을 사용할 수 있습니다.이는 선언된 함수의 로컬이기 때문입니다).int main(int argc, char *argv[]) { /* ... */ }
또는 동등한 것,9) 또는 다른 구현 정의 방식.
9) 그래서...
int
다음과 같이 정의된 typeef 이름으로 대체할 수 있습니다.int
또는 타입argv
라고 쓸 수 있다char **argv
기타 등등.
C11 및 C18 표준은 기본적으로 C99 표준과 동일합니다.
표준 C++
C++98 규격은 다음과 같습니다.
3.6.1 주요 기능 [basic.start.main]
1 프로그램에는 main이라고 하는 글로벌 기능이 포함되어 있어야 합니다.이것은 프로그램의 지정된 시작입니다.[...]
2 실장에서는 주요 기능을 미리 정의해서는 안 된다.이 기능은 과부하가 걸리지 않아야 한다.타입 int의 반환 타입을 가져야 하지만, 그 이외의 타입은 구현 정의되어 있다.모든 구현은 다음과 같은 주요 정의를 모두 허용해야 한다.
int main() { /* ... */ }
그리고.
int main(int argc, char* argv[]) { /* ... */ }
C++ 표준은 명시적으로 "[주함수]는 다음과 같은 유형의 반환 유형을 가져야 한다.int
그러나 그 이외의 타입은 실장 정의"이며, C 표준과 같은2개의 시그니처가 필요합니다.따라서 'void main()'은 C++ 표준에서는 직접 허용되지 않지만, 비표준 준거 실장(또는 표준 준거 실장에서도 표준 준거 실장에서는 대체를 표준 확장으로 허용하지 않음)을 막을 수 없습니다.
C++03, C++11, C++14 및 C++17 규격은 기본적으로 C++98과 동일합니다.
공통 내선번호
일반적으로 Unix 시스템은 세 번째 변종을 지원합니다.
int main(int argc, char **argv, char **envp) { ... }
세 번째 인수는 문자열에 대한 포인터의 null 종단 리스트입니다.각 인수는 이름, 등호 및 값(공백일 수 있음)을 가진 환경 변수입니다.이것을 사용하지 않는 경우에서도, 「」를 개입시켜 환경에 액세스 할 수 있습니다.extern char **environ;
'. 이 변수는 POSIX 헤더에 선언되지 않았습니다(이 응답의 이전 버전도 마찬가지입니다).
이는 부록 J에 문서화된 공통 확장으로 C 표준에 의해 인정된다.
###J.5.1 환경 인수
1 호스트 환경에서 메인 함수는 세 번째 인수를 받습니다.
char *envp[]
에 대한 포인터의 늘 종단 배열을 나타냅니다.char
각 문자열은 이 프로그램 실행(5.1.2.2.1)의 환경에 대한 정보를 제공하는 문자열을 가리킵니다.
Microsoft C
Microsoft VS 2010 컴파일러는 흥미롭습니다.웹 사이트에는 다음과 같은 내용이 있습니다.
main 선언 구문은 다음과 같습니다.
int main();
또는 옵션으로
int main(int argc, char *argv[], char *envp[]);
또는
main
그리고.wmain
함수는 반환으로 선언할 수 있습니다.void
(반환값 없음).선언하면main
또는wmain
return void로서 return 스테이트먼트를 사용하여 종료 코드를 부모 프로세스 또는 운영체제로 반환할 수 없습니다.종료 코드를 반환하려면main
또는wmain
로서 선언되다void
, 를 사용해야 합니다.exit
기능.
프로그램 실행 시 (부모에게 반환되는 종료 코드 또는 o/s)는 명확하지 않습니다.void main()
는 종료합니다.MS 웹사이트도 무음입니다.
흥미롭게도 MS는 의 2인칭 버전을 규정하지 않습니다.main()
C 및 C++ 규격에 필요한 것입니다.세 번째 인수가 다음과 같은 세 가지 인수의 형식만 규정합니다.char **envp
환경 변수 목록 포인터입니다.
Microsoft 의 페이지에는, 그 외의 선택사항도 일람표시되어 있습니다.wmain()
와이드 스트링과 그 이상을 필요로 합니다.
이 페이지의 Microsoft VS 2005 버전이 표시되지 않음void main()
또 다른 방법으로요.Microsoft VS 2008 이후 버전에서는 가능합니다.
이int main()
와 같은int main(void)
?
자세한 분석은 'C와 C++에서 반환해야 할 것'에 대한 제 답변의 끝을 참조하십시오.(이 질문은 C++를 지칭하는 것이 아니라 C++를 지칭하는 것이라고 생각한 적이 있는 것 같습니다.C++ 에서는, 다음의 2개의 인터페이스와int main()
그리고.int main(void)
그리고.int main()
관용 C++)입니다.
C에서는 두 표기 사이에 차이가 있지만 난해한 경우에만 알 수 있습니다.특히, 당신이 전화하면 다른 점이 있습니다.main()
C++에서는 할 수 없고 C++에서는 할 수 없습니다.
그int main()
표기법은 의 프로토타입을 제공하지 않습니다.main()
단, 이것은 재귀적으로 호출하는 경우에만 문제가 됩니다.와 함께int main()
, 나중에 (같은 기능 또는 다른 기능에서) 다음과 같이 쓸 수 있습니다.int rc = main("absolute", "twaddle", 2):
컴파일러는 코드 컴파일을 거부할 정도로 불만을 제기해서는 안 됩니다.단, 코드 컴파일러가 법적으로 불만을 제기할 수도 있습니다(그리고 사용).-Werror
경고는 오류로 변환됩니다).사용하시는 경우int main(void)
에의 후속 콜main()
에러가 생성되어야 합니다.함수는 인수를 받지 않는다고 말했지만 3개를 제공하려고 했습니다.물론, 당신은 합법적으로 전화할 수 없습니다.main()
(C90 시멘틱스를 아직 사용하지 않는 한) 선언 또는 정의하기 전에 실장에서는 C90 시멘틱스의 프로토타입이 선언되지 않습니다.main()
. NB: C11 규격은 다음 두 가지를 나타냅니다.int main()
그리고.int main(void)
예를 들어, 둘 다 C에서 유효합니다.다만, 그 사이에 미묘한 차이가 있습니다.
POSIX 지원execve()
즉, 이 기능은
int main(int argc, char *argv[], char *envp[])
추가된 인수는 환경, 즉 NAME=VALUE 형식의 문자열 배열입니다.
http://en.wikipedia.org/wiki/Main_function_(programming)#C_and_C.2B.2B
평상시와는 별도로int main(int argc, char *argv[])
및 POSIXint main(int argc, char **argv, char **envp)
, Mac OS X에서는
int main(int argc, char* argv[], char* envp[], char* apple[]);
물론 Mac 전용입니다.
Windows 에서는,
int wmain(int argc, wchar_t* argv[], wchar_t* envp[]);
Unicode(실제로 와이드 문자) 변종으로서 사용됩니다.물론 있죠.WinMain
너무.
int main(void)
일부 OS(Windows 등)에서는, 다음과 같이 유효합니다.
int main(int argc, char **argv, char **envp)
어디에envp
환경을 제공하고, 그렇지 않으면 를 통해 액세스 할 수 있습니다.getenv()
언급URL : https://stackoverflow.com/questions/2108192/what-are-the-valid-signatures-for-cs-main-function
'programing' 카테고리의 다른 글
구성 요소에서 vuex 작업을 매핑할 수 없습니다. (0) | 2022.08.13 |
---|---|
Vue 2 nextTick에 대해서 (0) | 2022.08.13 |
Swing과 AWT의 차이점은 무엇입니까? (0) | 2022.08.13 |
Spinner의 선택한 항목을 위치가 아닌 값으로 설정하는 방법은 무엇입니까? (0) | 2022.08.13 |
Vuex에서 업로드된 데이터를 어떻게 대기합니까? (0) | 2022.08.12 |