2013-12-13 226 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; 
}