typecasting
-
Hi guys I have a simple question for your. Let say that I have CreateFile function that takes as a first argument a LPCTSTR pointer. Also there is a declared buffer as char* szBuffer . I' ve seen a lot of guys using a typecasting for calling CreateFile like this CreateFile((LPCTSTR)szBuffer,....). I simply use CreateFile(szBuffer,....) with no problems Is that typecasting needed, given that both char* and LPCTSTR are pointers. Are there any true gains by using typecasting? Thanx
-
Hi guys I have a simple question for your. Let say that I have CreateFile function that takes as a first argument a LPCTSTR pointer. Also there is a declared buffer as char* szBuffer . I' ve seen a lot of guys using a typecasting for calling CreateFile like this CreateFile((LPCTSTR)szBuffer,....). I simply use CreateFile(szBuffer,....) with no problems Is that typecasting needed, given that both char* and LPCTSTR are pointers. Are there any true gains by using typecasting? Thanx
FotisSs wrote:
I' ve seen a lot of guys using a typecasting
Well, they were wrong... LPCTSTR is an array of TCHAR and the definition of a TCHAR depends if UNICODE is enabled or not. So, the code will work fine if UNICODE is not defined but it will not work if UNICODE is defined. In which case, if you have the typecast, it will simply be plain wrong (the string will be corrupted), but if you don't have the cast, then it will not compile (which is way better, because at least you don't have a nasty bug in your code). Typecasts should be avoided at maximum: using them too much means probably that you don't understand what you are doing. I suggest that you read this article[^], it explains a lot about character encoding (and about TCHAR).
Cédric Moonen Software developer
Charting control [v2.0] OpenGL game tutorial in C++ -
Hi guys I have a simple question for your. Let say that I have CreateFile function that takes as a first argument a LPCTSTR pointer. Also there is a declared buffer as char* szBuffer . I' ve seen a lot of guys using a typecasting for calling CreateFile like this CreateFile((LPCTSTR)szBuffer,....). I simply use CreateFile(szBuffer,....) with no problems Is that typecasting needed, given that both char* and LPCTSTR are pointers. Are there any true gains by using typecasting? Thanx
Usage of things like char is what scaring me more than the typecasts. One should ideally use
TCHAR
instead, which is neutral to builds (and is defined aschar
in anANSI
build and as awchar_t
in an Unicode build). If an API expects anLPCTSTR
, that means that it has both an ANSI and an Unicode implementation and the appropriate version will be called based on the build (for Unicode build,CreateFileW
and for anANSI
build,CreateFileA
will be called). There is no excuse to use char unless you're *sure* that you are always going to do anANSI
only build. Even then, I won't recommend it. Typecasting achar*
to anLPCTSTR
in an Unicode build is an invitation to disaster, because the wide version of the API will be called, which is going to expect awchar_t*
. There is no excuse to write such crap code.“Follow your bliss.” – Joseph Campbell
-
Usage of things like char is what scaring me more than the typecasts. One should ideally use
TCHAR
instead, which is neutral to builds (and is defined aschar
in anANSI
build and as awchar_t
in an Unicode build). If an API expects anLPCTSTR
, that means that it has both an ANSI and an Unicode implementation and the appropriate version will be called based on the build (for Unicode build,CreateFileW
and for anANSI
build,CreateFileA
will be called). There is no excuse to use char unless you're *sure* that you are always going to do anANSI
only build. Even then, I won't recommend it. Typecasting achar*
to anLPCTSTR
in an Unicode build is an invitation to disaster, because the wide version of the API will be called, which is going to expect awchar_t*
. There is no excuse to write such crap code.“Follow your bliss.” – Joseph Campbell
-
ok my fault I always tend to use specifically CreateFileA so it is LPSTR! And the question remains is typecasting needed?
FotisSs wrote:
And the question remains is typecasting needed?
I haven't answered it? Take
CreateFile
for example, which expects anLPCTSTR
If you have aTCHAR*
, no typecasting is needed, or typecasting has no effect. If you have achar*
, passing that to this function by casting it to anLPCTSTR
will cause trouble in Unicode Build. If you have awchar_t*
, passing that to this function by casting it to anLPCTSTR
will cause trouble inANSI
build. If you useTCHAR*
, no casting will be needed at all, and the correct data type will be automatically used. I will also highly recommend that you read the article that the other poster gave you a link for! It's well worth the time you'll spend on it.“Follow your bliss.” – Joseph Campbell
-
Hi guys I have a simple question for your. Let say that I have CreateFile function that takes as a first argument a LPCTSTR pointer. Also there is a declared buffer as char* szBuffer . I' ve seen a lot of guys using a typecasting for calling CreateFile like this CreateFile((LPCTSTR)szBuffer,....). I simply use CreateFile(szBuffer,....) with no problems Is that typecasting needed, given that both char* and LPCTSTR are pointers. Are there any true gains by using typecasting? Thanx
FotisSs wrote:
Is that typecasting needed, given that both char* and LPCTSTR are pointers.
Unicode issues aside, no, and not because they are both pointers. It's because the function's signature will treat the pointer argument as a
const
and not change it. On the other hand, if you had a function that was expecting aLPTSTR
and you were passing it aconst
pointer, then casting would be an issue."Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons