这就是我所拥有的:
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风格的转换或函数式转换。
帮助?
答案 0 :(得分:5)
您无法切换不是常量整数值的值。但由于参数匹配不是时间关键,因此您可以输入几个if
和strcmp
。
此代码显然在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 ++,您只能使用整数类型(int
,long
,char
等。
这样做的原因是,在使用整数时,可以使用链式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);