2009-09-11 5 views
2

Я пытаюсь вызвать функцию, которая принимает LPTSTR в качестве параметра. Я называю это строковым литералом, как в foo («bar»);const char * to LPTSTR

Я получаю сообщение об ошибке «Я не могу преобразовать параметр 1 из« const char [3] »в« LPTSTR », но я понятия не имею, почему и как его исправить. Любая помощь будет большой.

+1

Что это связано с OpenGL? – genpfault

+1

Возможно, вы имели в виду LPCTSTR вместо LPTSTR? –

ответ

6

Возможно, у вас определен UNICODE, а LPTSTR расширился в wchar_t *. Используйте макрос TEXT для строковых литералов, чтобы избежать проблем с этим, например. foo(TEXT("bar")).

+2

лично я всегда использую макрос «_T», но он делает то же самое :) – Goz

+0

ТЕКСТ («bar») - это строка const, LPCTSTR. LPTSTR не является константой, поэтому это может не сработать. –

+0

Спасибо. TEXT («bar») работал нормально. – captncraig

1

LPTSTR является неконстантным указателем на TCHAR. TCHAR, в свою очередь, определяется как char в строках ANSI и wchar_t в строках Unicode (с определенными символами UNICODE и/или _UNICODE).

это так, LPTSTR эквивалентна:

TCHAR foo[] = _T("bar"); 

Как это не константное, вы не можете смело называть его буквальными - литералы могут быть выделены в режиме только для чтения сегментов памяти, и LPTSTR является сигнал о том, что вызываемый может изменить содержимое строки, например

void truncate(LPTSTR s) 
    { 
    if (_tcslen(s) > 4) 
     s[3] = _T('\0'); 
    } 

Это будет вылетать, если вы прошли в буквальном, при компиляции с помощью Visual C++ 2008.

+0

Ваша строка кода не будет компилироваться в сборках Unicode - вам нужно использовать один из макросов smart T. В эти дни я просто даже не пользуюсь типами T, они являются анафронизмом в наши дни, поскольку все является unicode. –

+0

Спасибо, я редактировал, прежде чем увидел это. –

0
foo(const_cast<LPTSTR>("bar")); 

разобьет, как описано выше, когда Foo пытается изменить данные, которые были переданную ей.