2012-10-12 4 views
5

main (명령 행에서보다 체계적인 코드와 더 읽기 쉬운 코드)에서 명령 행 인수를 처리하는 코드를 유지하려면 어떻게해야할까요?main() 외부에서 argc와 argv 처리하기

void main(int argc, char* argv[]){ 
    //lots of code here I would like to move elsewhere 
} 

답변

4

어느 것은 매개 변수로 전달 또는 글로벌 변수에 보관. 메인에서 돌아 오지 않고 atexit 핸들러 나 전역 범위의 객체의 소멸자에서 처리하려고하면 여전히 존재하며 모든 범위에서 액세스 할 수 있습니다.

// Passing them as args: 
void process_command_line(int argc, char **argv) 
{ 
    // Use argc and argv 
    ... 
} 

int main(int argc, char **argv) 
{ 
    process_command_line(argc, argv); 
    ... 
} 

다른 방법 :이 캡슐화 및 프로그램을 변환 쉽게 당신이 원하는 경우에 당신이/대체 매개 변수를 수정하자 또는 이후 매개 변수로 전달

// Global variables 
int g_argc; 
char **g_argv; 

void process_command_line() 
{ 
    // Use g_argc and g_argv 
    ... 
} 

int main(int argc, char **argv) 
{ 
    g_argc = argc; 
    g_argv = argv; 
    process_command_line(); 
    ... 
} 

은 더 나은 디자인 예를 들어

도서관에. 전역 변수는 더 쉽습니다. 어떤 이유로 든 args에 액세스하는 여러 함수가있는 경우에는 한 번만 저장할 수 있기 때문에 모든 다른 함수 사이에서 args를 계속 전달할 필요가 없으므로 전역 변수가 더 쉽습니다.

2

은 단순히 당신이 그들을 처리하려는 함수의 인수로 argcargv를 전달합니다.

void parse_arg(int argc, char *argv[]);

3

실용적인 경우 표준을 지켜야합니다. 따라서, 유효한 C 또는 C++ 적이있다

void main 

를 작성하지 않지만, 대신에 그와

int main 

쓰기, 코드는 예를 들어, 컴파일 할 수 있습니다 g ++ (일반적인 컴파일러 옵션 사용).

void main이 주어지면 Windows 환경이 의심됩니다. 그리고 어쨌든 은 Windows 환경에서 프로그램 사용을 지원하기 위해이므로 Windows에서는 main 인수를 사용하지 않아야합니다. 그들은 * nix에서 그 환경을 위해 설계 되었기 때문에 작동합니다. 그들은 Windows에서 일반적으로 작동하지 않습니다. 왜냐하면 기본적으로 (매우 강력한 규칙에 따라) Windows ANSI로 인코딩되기 때문에 사용자의 현재 로케일 외부의 문자로 파일 이름을 인코딩 할 수 없기 때문입니다.

Windows의 경우 GetCommandLine API 함수 및 자매 파싱 기능을 사용하는 것이 좋습니다. 이식성을 위해 이것은 일부 명령 행 인수 모듈에 더 잘 캡슐화되어야합니다. 그런 다음 Windows에서 wchar_t을 사용하고 * nix & hellip;에서 char을 사용하는 것과 관련된 흥미로운 문제를 처리해야합니다.

어쨌든, 해당 * nix API가 확실하지 않거나 하나라도 있지만 google은 아닙니다. 최악의 경우 * nix의 경우 명령 행 인수 모듈을 항상 main에서 초기화 할 수 있습니다. * nix의 추함은 C++의 이식성이 가장 낮고 OS 고유의 구조 인 표준 main을 사용하여 이식성을 지원해야하는 필요성에서 직접적으로 유래합니다.

+0

나는'void main'을 통해'int main'에 전적으로 동의합니다. 그러나, 다른 논평은 나를 떠난다. .. bemused. 윈도우 이외의 어떤 시스템이'main()'에 대한 표준 C++ 규칙에 문제가 있습니까? 나는 하나를 알지 못하므로 '비 휴대용'과 'OS 특유의'표준 협약을 무시하는 것이 OTT 인 것 같습니다. –

+0

@JonathanLeffler : Windows가 아닌 'main'인수가 작동하지 않는 다른 시스템 (영어 알파벳 순수 ASCII 텍스트 제외)을 인식하지 못합니다. 여전히 Windows **에서 작동하지 않는 기능은 ** 휴대 가능하지 않으며 Unix-land ** 용으로 설계된 기능은 ** OS에 따라 다릅니다. 그리고 'main'인수 규칙은 Windows에서 작동하지 않으며 (즉, 이식성이 없음) Unix-land (즉, OS에만 해당) 용으로 설계되었으며 두 가지 측면이 강하게 연결되어 있습니다. 그것에 대해 재미있는 것은 전혀 없습니다. 나는 그 끈기에 대한 추악한 정치적 이유 만 생각할 수 있습니다. –

0

"getoptlong"함수 및 라이브러리 군을 확인하십시오. 이것들은 당신의 프로그램이 기대하는 논증을 정의하는 구조화 된 방법을 제공하며, 당신을 위해 쉽게 파싱 할 수 있습니다.또한 문서/도움말 응답 생성에 도움이 될 수 있습니다.

이것은 UNIX 세계에서 오래된 라이브러리이며 C#에서도 .Net 구현이 있습니다. (+ Perl, Ruby, & 더 많은 정보가있을 것입니다. 한 번 배우고 모든 것을 사용하십시오!)