2010-08-10 6 views
0

는 여기에 내가있어 무엇 : 인수가 TCHAR *의 같은 배열에 와서 그래서 내가 창을 사용하고Switch 문에서 Cmd Line Argument에 TCHAR *를 어떻게 사용합니까?

switch(argv[0]) 
{ 
    case "-test1": 
    AfxBeginThread(method1, 0); break; 
    case "-test2": 
    AfxBeginThread(method2, 0); break; 
    case "-test3": 
    AfxBeginThread(method3, 0); break; 
    default: 
    AfxBeginThread(method1, 0); break; 
} 

. 이 작업을하려면 무엇을해야합니까?

편집 :

그래서 나는 지금 다음을 수행하려고 해요 ... 나는 다음과 같은 컴파일 오류

오류 C2664지고있어

if(strcmp(argv[0], "-http") == 0) 
    doStuff(); 

'을 strcmp는'수 없습니다 매개 변수 1을 'TCHAR *'에서 'const char *'로 변환하십시오. 유형이 지정되지 않았습니다. 변환에는 reinterpret_cast, C 스타일 또는 형변환이 필요합니다.

도움 말? 작동하지 않습니다

+0

당신은 더 구체적 수 있습니까?지금은 효과가없는 것은 무엇입니까? 컴파일 오류? 런타임 에러? 논리 오류? –

+0

@Alex Zylman : "integral expression required" – SigTerm

+0

@SigTerm : 컴파일러에서 제공하는 오류 메시지를 청취해야합니다. James가 대답 한 바에 따르면 C/C++의 스위치 케이스는 정수 타입 만 허용합니다. 이것은 컴파일러가 제공하는 것과 동일한 오류입니다. –

답변

5

당신은 일정한 정수 값없는 값을 전환 할 수 없습니다. 인수 매칭 시간이 중요하지 않기 때문에, 당신은 대신 if 's 및 strcmp's의 몇 넣을 수 있습니다.

if  (_tcscmp(_T("-test1"),argv[0])==0) AfxBeginThread(method1, 0); 
else if (_tcscmp(_T("-test2"),argv[0])==0) AfxBeginThread(method2, 0); 
else if (_tcscmp(_T("-test3"),argv[0])==0) AfxBeginThread(method3, 0); 
else AfxBeginThread(method1, 0); 

TCHAR, _tcscmp_T() 일 :이 코드는 Windows에서 분명히 실행

, 당신이 가장 가능성이 당신이 _tcscmp() 대신 strcmp, 매크로 좋은 오래된 _T()해야한다는 것을 의미하는 TCHAR을 사용하는 수밖에 여기에 설명 :

짧은 이야기는 당신이 올바른 기능 (_tcscmp->strcmp or wcscmp or mbccmp) 따라로 확장이 매크로를 사용하여 단일 소스에서 다양한 문자 표현 (16 비트 UCS-2, 8 비트 멀티 바이트 등) 프로그램을 구축 할 수있다 당신이 만들고있는 캐릭터 표현의

+0

이것은 효과가 있었지만 argv [0] 대신 argv [1]로 만들어야했습니다. 첫 번째는 예약 된 것 같습니다. 감사! 또한 내 앱이 일반적인 문자가 아닌 wchar을 사용하고있는 것으로 나타났습니다. 나는 XP를 돌리고있다. 유니 코드가 아닌 ASCII를 사용하면 안됩니까? – themaestro

4

. C/C++에서 switch은 정수 유형에서만 작동합니다. 다른 언어

은 (VB, C#을), 당신은 switch 문에서 모든 데이터 유형을 사용할 수 있지만, C & C++에, 당신은 단지 정수 타입 (int, long, char 등)를 사용할 수 있습니다.

그 이유의 int를 사용하는 경우, if()을 체인 사용을 통해 사용할 수있는 최적화 있다는 것입니다. switch은 최적화를 이용하기 위해 만들어졌습니다. 나중에 사람들은 깨달았고, 코드를 더 깔끔하게 만들어 다른 언어에 추가했습니다. 그러나 최적화 된 점을 이용하지 않고 if()를 묶어서 사용하는 것의 축약처럼. 나는이 일을하기 위해 어떻게해야합니까 무엇

2

? 이 같은

뭔가 :

// Beware, un-compiled code ahead! 
namespace { 
    typedef std::map<std::basic_string<TCHAR>,AFX_THREADPROC> thread_func_map_type; 
    typedef thread_func_map_type::value_type thread_func_entry_type; 

    const thread_func_entry_type thread_func_entries[] = 
    { thread_func_entry_type(_T("-test1"), method1) 
    , thread_func_entry_type(_T("-test2"), method2) 
    , thread_func_entry_type(_T("-test3"), method3) }; 

    const thread_func_map_type thread_func_map(thread_func_entries 
              , thread_func_entries 
              + thread_func_entries 
              /thread_func_entries[0]); 
} 

// ... 

thread_func_map_type::const_iterator it = thread_func_map.find(argv[1]); 
if(it == thread_func_map.end()) 
    it = thread_func_map.find("-test1"); 
assert(it!=thread_func_map.end()); 
AfxBeginThread(it->second, 0); 
+0

heh -이 C 변형 (너무 많은 임베디드 작업 ...)을 코딩했습니다. –

+0

이것은 TCHAR 문제를 해결하지 못합니다. –

+0

@Adrian : 네 말이 맞아, 그걸 깜빡 했어! 이제 수정되었습니다. – sbi

관련 문제