Я столкнулся с очень странным поведением Embarcadero C ++ Builder при использовании компилятора CLANG.
Пример очень простой:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
std::wostringstream woss;
woss << std::wstring(L"N°1: ") << (int) 1234;
woss << '\r' << '\n';
woss << std::wstring(L"N°2: ") << (float) 12.34;
Memo1->Lines->Add( woss.str().c_str() );
std::ostringstream oss;
oss << std::string("N°3: ") << (int) 4567;
oss << '\r' << '\n';
oss << std::string("N°4: ") << (float) 45.67;
Memo1->Lines->Add( oss.str().c_str() );
}
Пока код компилируется классическим компилятором Borlands, он выводит именно то, что я ожидал:
- N°1: 1234
- N°2: 12.34
- N°3: 4567
- N°4: 45.67
Однако как только я переключаюсь на компилятор CLANG (bcc32c) (сняв флажок использовать классический компилятор в диалоговом окне настроек), я получаю следующий результат:
- N°1: 1234
- N°2: -0
- N°3: 4567
- N°4: -0
Изменить: не обращайте внимания на проблему с std :: string - важно ложное число с плавающей запятой.
(Мало того, что числа с плавающей запятой дробятся, также, похоже, возникает проблема с интерпретацией обычных std :: string.)
В чем проблема с bcc32c и как с этим справиться?
Я использую Embarcadero C ++ Builder 10.0 (Сиэтл) для целевой платформы WIN32.
Спасибо
float
s, но это объясняетN°3
. - person Scheff's Cat   schedule 01.12.2020oss << '\r' << '\n';
используйте толькоoss << '\n';
.\n
будет автоматически преобразован в правильный символ новой строки для каждой платформы средой выполнения C. И попробуйте использовать кодировку UTF-8 только для новых компиляторов. Вероятно, Embarcadero настолько стар, что использует кодовые страницы ANSI. - person phuclv   schedule 01.12.2020N°3
:°
имеет код 176 ('\xb0'
) в Windows-1252, но представляет собой двухбайтовую последовательность в UTF-8:"\xc2\xb0"
. Теперь снова эти два байта в Windows-1252:°
. Итак, я предполагаю, что ваш строковый литерал в исходном коде закодирован в UTF-8, но вывод выполняется с его декодированием как Windows-1252. - person Scheff's Cat   schedule 01.12.2020N�1: 1234 N�2: 12.34 N°3: 4567 N°4: 45.67
с G ++ в Windows. (Хотя без этой древней__fastcall
штуки, но это ничего не должно изменить) - person nada   schedule 01.12.2020