2013-12-13 225 views
6

我试图使用beginthreadex创建一个线程,该线程将运行一个将char作为参数的函数。尽管如此,我在C++方面很糟糕,但我无法弄清楚如何将char转换为const char ,beginterrex需要它的参数。有没有办法做到这一点?我发现很多问题将char转换为const char,但不是const char *。C++将char转换为const char *

+0

您可以将'char *'隐式转换为'const char *'。不需要做任何事情。 – asveikau

+0

@asveikau:这不会帮助你将'char'值传递给需要指针的东西。 –

+0

根据文档(http://msdn.microsoft.com/en-us/library/kdzttdcb.aspx)'beginthreadex'想要一个'void *'。 – dalle

回答

9
char a = 'z'; 
const char *b = &a; 

当然,这是在堆栈上。如果你需要在堆上,

char a = 'z'; 
const char *b = new char(a); 
+0

问题是关于C++,所以你可能想用'new'来代替。 – filmor

+0

@filmor,你是对的。完成。 –

0

如果函数需要一个const指针退出的字符,你应该与保罗·德雷珀的答案去。但请记住,这不是一个指向空终止字符串的指针,函数可能期望的是什么。如果你需要一个指向空结尾的字符串,你可以使用std::string::c_str

f(const char* s); 

char a = 'z'; 
std::string str{a}; 
f(str.c_str()); 
0

既然你没有表现出来,很难确切地知道自己想要什么的任何代码,但这里是一个方法来调用一个函数期待一个字符为一个线程中的一个参数。如果你不能改变函数来转换参数本身,你需要一个蹦床函数来坐在中间来做这件事,然后调用实际函数。

#include <Windows.h> 
#include <process.h> 
#include <iostream> 

void ActualThreadFunc(char c) 
{ 
    std::cout << "ActualThreadFunc got " << c << " as an argument\n"; 
} 

unsigned int __stdcall TrampolineFunc(void* args) 
{ 
    char c = *reinterpret_cast<char*>(args); 
    std::cout << "Calling ActualThreadFunc(" << c << ")\n"; 
    ActualThreadFunc(c); 
    _endthreadex(0); 
    return 0; 
} 

int main() 
{ 
    char c = '?'; 
    unsigned int threadID = 0; 
    std::cout << "Creating Suspended Thread...\n"; 
    HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &TrampolineFunc, &c, CREATE_SUSPENDED, &threadID); 
    std::cout << "Starting Thread and Waiting...\n"; 
    ResumeThread(hThread); 
    WaitForSingleObject(hThread, INFINITE); 
    CloseHandle(hThread); 
    std::cout << "Thread Exited...\n"; 

    return 0; 
}