Delphi의 Format은 string, array of const 를 인자로 받습니다.
그래서 변수들을 [] 로 감싸서 array 표현을 한거죠.
C++ 에서는 string, TVarRec*, int 의 3개의 인자를 받게 되어있는데,
TVarRec*, int 를 처리해주는 ARRAYOFCONST(( )) 매크로가 있습니다.
Caption = Format("%s", ARRAYOFCONST((wstr))); // ok
Caption = Format("%s - %d", ARRAYOFCONST((wstr, i))); // ok
항상 ARRAYOFCONST를 쓰면 불편해서인지 가변 인자의 Format이 System.SysUtils.hpp 에 있습니다.
어느 버전부터 있는지는 모르겠습니다만, 1번과 4번의 경우는 이 함수에서 처리가 되어서 에러가 나지 않았습니다.
가변 인자 함수로 처리되려면 is_TVarRec_compat 조건을 만족해야 하는데, wchar_t * 는 해당하지 않습니다.
그래서 매칭되는 함수를 찾지 못합니다.
System.SysUtils.hpp 를 열어서 is_TVarRect_compat 을 찾아보시면 가변 Format에 허용되는 타입을 찾아 볼 수 있습니다.
10.4.2 기준으로 void, char, int, unsigned, long, unsigned long, double(win64, ios, android 허용), long double, ShortString, UnicodeString, Currency, Variant, WideString, long long, unsigned long long 이 있습니다.
가변 Format 코드를 복사해서 Enable 조건을 제거해보면 아래의 코드도 잘 동작하긴하는데,
char*, wchar_t* 의 경우는 특정 조건(null-terminated)을 만족하지 않으면 안전하지 않아서 허용하지 않은건가 하고 추측을 해봅니다;
짜증 님이 쓰신 글 :
: 시드니 10.4.2 테스트중인데여
:
: procedure TForm2.Button1Click(Sender: TObject);
: var
: wstr: PWideChar;
: i: Integer;
: begin
: wstr := 'wstr';
: i := 888;
: Caption := Format('%s', [wstr]); // 정상
: Caption := Format('%d - %s', [i, wstr]); // 정상
: Caption := Format('%s - %d', [wstr, i]); // 정상
: end;
:
:
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: String str = "str";
: int i = 888;
: const wchar_t *wstr = L"wstr";
: Caption = Format("%d", i); // 정상
: Caption = Format("%s", wstr); // 컴파일 에러
: Caption = Format("%s - %d", wstr, i); // 컴파일 에러
: Caption = Format("%d - %s", i, wstr); // 정상
: }
:
: 델파이는 에러 없이 컴파일되는데
: 빌더로 하면 위와 같은 에러가 나거든여
:
: 첫번째와 네번째는 에러없이 컴파일되면서
: 두번째 세번째는 컴파일 에러가 나는데
: 도무지 이해가 안되네여
:
: 10.4.1로 해봐도 같은 증상입니다
:
|