|
| atoi af cstring (MFC) Fra : Troels Thomsen |
Dato : 20-06-03 13:51 |
|
Hej,
CString asdf = "123"
int a = atoi ( asdf );
Kræver det ikke en overloaded version af atoi
int atoi(const cstring& str) ... måske?
Jeg har ledt alle .h filer igennem på min hd men denne prototype findes
ikke, og alligevel kompilerer det, og virker tilsyneladende !!!
Eller er der noget automatisk cstring til char* konvertering (promotion
aktigt) der er i spil ??
mvh Troels
| |
Bertel Brander (20-06-2003)
| Kommentar Fra : Bertel Brander |
Dato : 20-06-03 14:44 |
|
Troels Thomsen wrote:
> Hej,
>
> CString asdf = "123"
> int a = atoi ( asdf );
>
> Kræver det ikke en overloaded version af atoi
> int atoi(const cstring& str) ... måske?
>
> Jeg har ledt alle .h filer igennem på min hd men denne prototype findes
> ikke, og alligevel kompilerer det, og virker tilsyneladende !!!
> Eller er der noget automatisk cstring til char* konvertering (promotion
> aktigt) der er i spil ??
>
Der er automatisk konvertering fra en CString til en const char *
Så du kan også:
CString cs = "whatever";
char c[1024];
strcpy(c, cs);
Men du kan ikke:
strcpy(cs, c);
Hvis du bruger CString som argument til *printf(...) skal du
dog lave en cast.
Alt dette skyldes at CString klassen har en operator:
operator LPCTSTR ( ) const;
/b
--
Bertel Brander, author of Wain, a free text editor for programmes:
http://home20.inet.tele.dk/midgaard/program.htm
| |
Troels Thomsen (20-06-2003)
| Kommentar Fra : Troels Thomsen |
Dato : 20-06-03 15:41 |
|
Tak
Og den funktion må så blive kaldt inden kaldet til atoi,
det må man kunne se i disassembly,
yeps:
289: int a = atoi (sdf);
004026C6 lea ecx,[ebp-14h]
004026C9 call CString: erator char const * (00402224)
004026CE mov esi,esp
etc
etc
> operator LPCTSTR ( ) const;
>
Hvad er det nu const til sidst betyder?
tpt
| |
Bertel Brander (20-06-2003)
| Kommentar Fra : Bertel Brander |
Dato : 20-06-03 18:14 |
|
Troels Thomsen wrote:
> Tak
> Og den funktion må så blive kaldt inden kaldet til atoi,
> det må man kunne se i disassembly,
> yeps:
>
> 289: int a = atoi (sdf);
> 004026C6 lea ecx,[ebp-14h]
> 004026C9 call CString: erator char const * (00402224)
> 004026CE mov esi,esp
> etc
> etc
>
>
>
>>operator LPCTSTR ( ) const;
>>
>
> Hvad er det nu const til sidst betyder?
>
const til sidst betyder blot at operatoren ikke modificerer
det objekt den er kaldt med, så vidt jeg ved har det kun
betydning for optimering.
/b
| |
Troels Thomsen (24-06-2003)
| Kommentar Fra : Troels Thomsen |
Dato : 24-06-03 17:18 |
|
> > int atoi(const cstring& str)
> operator LPCTSTR ( ) const;
Det slog mig lige : Hvis begge ting findes, hvad vælger compileren så?
(Det kunne jeg jo finde ud af ved at prøve, så spørgsmålet er nok nærmere:
hvorfor ? )
mvh Troels
| |
Bertel Brander (24-06-2003)
| Kommentar Fra : Bertel Brander |
Dato : 24-06-03 23:01 |
|
Troels Thomsen wrote:
>>>int atoi(const cstring& str)
>>
>>operator LPCTSTR ( ) const;
>
>
> Det slog mig lige : Hvis begge ting findes, hvad vælger compileren så?
> (Det kunne jeg jo finde ud af ved at prøve, så spørgsmålet er nok nærmere:
> hvorfor ? )
Jeg ved ikke ret meget om C++, så jeg satte mig for at prøve det:
#include <afx.h>
void my_func(CString &ref)
{
printf("Called ref: %s\n", (const char *)ref);
}
void my_func(const char *ref)
{
printf("Called pointer: %s\n", ref);
}
int main(void)
{
CString test = "WhatEver";
my_func(test);
return 0;
}
Den valgte at kalde "void my_func(CString &ref)", jeg har ingen ide om
hvorfor.
/b
| |
Ivan Johansen (25-06-2003)
| Kommentar Fra : Ivan Johansen |
Dato : 25-06-03 07:19 |
|
Bertel Brander wrote:
> Den valgte at kalde "void my_func(CString &ref)", jeg har ingen ide om
> hvorfor.
Fordi den passer perfekt, mens der skal laves en konvertering for at
kalde my_func(const char*).
Det samme sker her:
void f(int);
void f(char);
int i = 0;
f(i);
Her kaldes f(int) fordi den passer perfekt. Hvis f(int) ikke var der
ville den kalde f(char).
Ivan Johansen
| |
|
|