2016-09-09 1 views
2

Еще одно отличие между BCC32 и BCC32C. Функция Format не отображается правильно для BCC32C. В следующем примере BCC32 показывает «7 тестовый тест 7» (правильный), но BCC32C показывает «7 тестовых тестов». Я использую Rad Studio 10.1. Вы можете повторить его создание пустого проекта, добавить кнопку, а затем следующий код:Функция форматирования не работает для BCC32C

void __fastcall TForm1::Button2Click(TObject *Sender) 
{ 
    int i=7; 

    String str="test"; 

    ShowMessage(Format("%d %s %s %d", ARRAYOFCONST((i, str, str, i)))); 
} 

Есть ли обходной путь для этого? Я начинаю думать, что BCC32C не готов к производству. Я нахожу много проблем.

+0

'Format()' это хорошо, но 'ARRAYOFCONST' кажется замарать . См. Ответ от @Sam. Его решение работает. «ARRAYOFCONST» должен создать тот же набор из двух аргументов. И действительно, ** еще одна проблема с BCC32C **. Это отлично работает в 64-битном (также Clang) компиляторе. –

+0

Является ли также макросом 'OPENARRAY()'? Я предполагаю, что это будет так, потому что он объявлен аналогично «ARRAYOFCONST()», просто он использует определяемое пользователем имя типа вместо 'TVarRec'. –

ответ

1

Я считаю, что правильный способ сделать это:

void __fastcall TForm1::Button2Click(TObject *Sender) 
{ 
    int i=7; 
    String str="test"; 
    TVarRec Args[] = {i, str, str, i}; 

    ShowMessage(Format("%d %s %s %d", Args, 3)); 
} 

Сэм

+0

'ARRAYOFCONST (())' должен работать и создавать тот же набор аргументов (массив и число). Это происходит в BCC32 (Borland) и BCC64 (Clang), но не в BCC32C (Clang). Но ваш код работает и в BCC32C, поэтому это хороший способ устранения неисправного 'ARRAYOFCONST (())'. –

+0

Но кто-нибудь знает * почему * 'ARRAYOFCONST' неисправен? Что он делает по-разному в BCC32C, что он не делает в BCC32 и BCC64? У меня нет Берлина, или я буду искать себя. –

+0

@RemyLebeau Я не уверен, почему 'ARRAYOFCONST' не работает. Это может иметь какое-то отношение к тому, как препроцессор расширяет макрос. Я считаю, что это должно быть сообщено как ошибка для Embarcadero. Сказав это, у меня были ужасные переживания с макросами. И как личная практика (** НЕ рекомендую ее всем, только мне **), я избегаю использовать их как можно больше. – Sam

1

После исследования, кажется, мне нужно ждать нового выпуска Rad Studio. Между тем, я создал обходной путь, что сейчас он, кажется, работает:

#if defined(__clang__) 
    #define VRARRAY(...) (TVarRec[]){__VA_ARGS__}, sizeof((TVarRec[]){__VA_ARGS__})/sizeof(TVarRec) 
#else 
    #define VRARRAY(...) System::OpenArray<System::TVarRec>(__VA_ARGS__), sizeof(System::OpenArrayCounter<System::TVarRec>::Count (__VA_ARGS__))-1 
#endif 

Тогда, я могу использовать:

ShowMessage(Format("%d %s %s %d", VRARRAY(i, str, str, i))); 
+1

Вы также можете использовать 'ShowMessage (System :: String(). Sprintf (L"% d% s% s% d ", i, str, str, i));' – Sam

+0

Я использую 'String :: sprintf() 'также (и' cat_sprintf() '). Мне никогда не нравилось 'Format()', это слишком уродливо на C++, а не так гибко, как 'sprint()'. –

+0

@RemyLebeau Я согласен с тобой% 100. С очень небольшим исключением я использую 'String :: sprintf()' в моем коде все время. Единственное, что меня беспокоит, это 'sprintf' не ** static **, я думаю, что это должно быть. Вы согласны? – Sam

Смежные вопросы