2010-03-18 5 views
4

main에 인수를 사용하지 않고 명령 줄 인수에 액세스 할 수있는 방법이 있습니까? 다른 함수에서이 함수에 액세스해야합니다.이 함수를 전달하지 않는 것이 좋습니다.주 **에서 char ** argv를 사용하지 않고 명령 줄 인수에 액세스

Mac OS 및 Linux with GCC에서만 작동하는 솔루션이 필요합니다.

+8

나는 당신이 그들을 통과해야한다고 강력히 믿습니다. 전 세계적인 상태에 의존하는 것이 결코 좋은 일이 아니라고 생각합니다. – zneak

+1

그것들을 전달하는 것은 끔찍하게 복잡 할 필요는 없습니다. 내부의 args-and-options 구조체로 처리 할 수 ​​있으며 중복 된 argc + argv 루프/검증을 피하면서 한 가지만 전달합니다. – Cascabel

+1

Jefromi의 의견에 대한 예는 GNU의 gengetopt 유틸리티의 기능에서 볼 수 있습니다. 그 절차가 진행되는 길이며 도구가 고려되어야합니다. – dmckee

답변

3

C 런타임이 인수를 준비하고이를 int argc, char **argv을 통해 메인으로 전달할 것이라고 생각하지 않습니다. 해킹으로 동작을 조작하려고 시도하지 마십시오. 이식 할 수 없거나 정의되지 않은 동작 일 수 있습니다. !! !! 규칙에 충실하면 이식성이 높아집니다. 깨는 것 외의 다른 방법은 없습니다 ...

+0

질문에 이식 할 필요는 없으며 GCC에서만 작동해야합니다 (플랫폼 별 소스 파일에서만 사용하고 있음). –

+0

그것에 대해 생각한 후에 이것이 최고의 해결책이 될 것입니다. –

1

하실 수 있습니다. 대부분의 플랫폼은 전역 변수 __argc 및 __argv를 제공합니다. 그러나 다시, 나는 zneak의 의견을지지한다.

P. boost :: program_options를 사용하여 구문 분석하십시오. C++에서 다른 방법으로하지 마십시오.

+1

Mac OS에서 작동하지 않는 것 같습니다. –

2

원하는 경우 전역 변수에 복사 할 수 있습니다.

0

이미 소비 된 공간에 포인터를 전달하는 것이 그리 나쁜 이유가 있습니까? 문제의 기능에 대한 논점을 없애지 않고도 실질적인 비용 절감 효과를 얻을 수 있으며 흥미 진진한 불꽃 놀이를 시작할 수 있습니다. 크리에이티브 hackery로 main()의 호출 스택을 둘러싸는 것은 일반적으로 정의되지 않은 동작 또는 컴파일러 관련 동작에 의존하게됩니다. 둘 다 기능과 이식성에 좋지 않습니다.

문제의 인수는 포인터인데, 인수에 대해 포인터는 사용자가 수행하는 작업에 관계없이 공간을 소비합니다. 그것들의 인덱스의 편리 성은 sizeof (int)만큼 싸다. 나는 그것을 사용하지 않을 이유가 없다.

오히려 적극적으로 또는 성급하게 최적화하는 것처럼 들리거나 사용자가 혼란스럽지 않게 코드에 기능을 추가해야하는 것처럼 들립니다. 두 경우 모두, 일을 전통적으로하면 시간과 문제를 줄일 수 있습니다. 글로벌 생성자에서 예 - - 달리가 더 나은을 전달하는main()이는 argc/argv를 하기 전에 필요한 경우

+0

최적화를 시도하지 않고 main 외부에서 명령 줄 인수에 액세스하려고합니다. –

1

리눅스에서는이에만 필요합니다 (/proc/self/cmdline (/proc가 존재한다고 가정)을 열고 수동으로 분석 할 수 글로벌 바르를 통해).

더 많은 솔루션은 여기에 사용할 수 있습니다 http://blog.linuxgamepublishing.com/2009/10/12/argv-and-argc-and-just-how-to-get-them/

그래, 그것은 총과 인자를 취하지하지만 당신은 실제적인 문제를 해결하는 경우 당신은 걱정하지 않을 수 있습니다.

+0

Mac OS에서 작동하는 것이 요구되었습니다. – Andras

6

나는 MacOS에서 어떻게하는지 모르지만, 여기서 설명 할 트릭은 약간의 교차 판독으로 MacOS에 이식 될 수 있다고 생각됩니다.

리눅스에서는 ELF 바이너리의 ".init_array"섹션을 사용하여 프로그램 초기화 중에 (main()이 호출되기 전에 호출되는) 함수를 등록 할 수 있습니다. 이 함수는 일반적인 main() 함수와 같은 시그니처를 가지며, "void"를 반환합니다. 따라서이 함수를 사용하여 argc, argv [] 및 evp []를 기억하거나 처리 할 수 ​​있습니다.

static void my_cool_main(int argc, char* argv[], char* envp[]) 
{ 
    // your code goes here 
} 

__attribute__((section(".init_array"))) void (* p_my_cool_main)(int,char*[],char*[]) = &my_cool_main; 

PS : 여기

당신이 사용할 수있는 몇 가지 코드이 코드는 또한 라이브러리에 넣을 수 있습니다, 그래서 귀하의 경우에 맞게해야한다. prg가 valgrind와 함께 실행될 때도 작동합니다. - valgrind는 새 프로세스를 포크하지 않으므로 원래의 valgrind 명령 줄을 보여주는/proc/self/cmdline이됩니다.

PPS : 매우 초기 프로그램을 실행하는 동안 많은 서브 시스템이 아직 완전히 초기화되지 않았 음을 명심하십시오. libc I/O 루틴을 사용해 보았지만 작동하지는 않지만 의존하지는 않습니다. 아직 건설, 등등 ...

관련 문제