如何在Switch语句中的Cmd Line Argument中使用TCHAR *?

时间:2010-08-10 20:47:53

标签: c++ windows mfc switch-statement

这就是我所拥有的:

 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;
 }

我正在使用Windows,因此参数作为TCHAR *进入数组。我需要做些什么来完成这项工作?

编辑:

所以我现在正尝试做以下事情......

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

我收到以下编译错误

错误C2664:'strcmp':无法将参数1从'TCHAR *'转换为'const char *'           指向的类型是无关的;转换需要reinterpret_cast,C风格的转换或函数式转换。

帮助?

3 个答案:

答案 0 :(得分:5)

您无法切换不是常量整数值的值。但由于参数匹配不是时间关键,因此您可以输入几个ifstrcmp

此代码显然在Windows下运行,您很可能被迫使用TCHAR,这意味着您需要_tcscmp()而不是strcmp,以及好的_T() }宏:

 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()事项:

简短的说法是,您可以使用这些宏扩展到正确的函数({{1),从单一来源为各种字符表示(16位UCS-2,8位多字节等)构建程序。根据您正在构建的字符表示形式。

答案 1 :(得分:4)

那不行。在C / C ++中,switch仅适用于整数类型。

在其他语言(VB,C#)中,您可以在switch语句中使用任何数据类型,但在C& C ++,您只能使用整数类型(intlongchar等。

这样做的原因是,在使用整数时,可以使用链式if()进行优化。创建switch是为了利用该优化。后来,人们意识到,它使代码更整洁,并将其添加到其他语言中 - 但这只是链接if()s的简写 - 而不利用优化。

答案 2 :(得分: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);