Передача string из DLL (C#) в MetaTrader 4. Проблема с кодировкой? - страница 2

 
Vladimir Simakov #:

А правильный ответ надо искать в стандарте.

Whether all string literals are stored in nonoverlapping objects and whether successive evaluations of a string literal yield the same or a different object is unspecified.

Так, что это unspecified behavior.

PS. Правда вероятность получить где-то результат отличный от true в одной единице трансляции исчезающе мала.

Да, интересно. Спасибо. Правда, все это из области "программирование ради программирования". Практического применения такого случая все равно нет, т. к. литералы - большая редкость. Чаще всего строки формируются, а не заводятся константно. Локализацию не зря придумали. 

 
Vladimir Simakov #:

Я это к чему. Не надо строки гонять через нативный код. Если сильно надо получать их в dll, то делайте функцию size_t(wchar_t*,size_t) и заполняйте массив символов. Не помню, они гарантируют, что сигнатура импорта uint(string&,uint)/ulong(string&,ulong) правильно указатель на выделенную в string память передаст, если есть в справке такая гарантия, то юзайте, если нет, то костыль с CharArrayToString после заполнения массива.

к слову, "костыль с CharArrayToString" чуть не единственный правильный способ гонять строки.

Потому что какая конкретно кодировка подразумевается в mql-ной string (или windows wchar_t) понятие сильно растяжимое, о том доподлинно ведают только CharArrayToString и обратная ей :-)

 
Ihor Herasko #:

Да, интересно. Спасибо. Правда, все это из области "программирование ради программирования". Практического применения такого случая все равно нет, т. к. литералы - большая редкость. Чаще всего строки формируются, а не заводятся константно. Локализацию не зря придумали. 

Ты даже не представляешь, сколько багов вокруг нуль-терминальных строк в  реальных проектах С/С++)))

PS. Лично нарывался, нарываюсь и буду нарываться)))

PSS. Да есть std::string, но есть кейсы где он реально тяжелым становится и приходится спускаться на уровень си-шных функций, ну и пошла веселуха)))

 
Vladimir Simakov #:

Ты даже не представляешь, сколько багов вокруг нуль-терминальных строк в  реальных проектах С/С++)))

PS. Лично нарывался, нарываюсь и буду нарываться)))

PSS. Да есть std::string, но есть кейсы где он реально тяжелым становится и приходится спускаться на уровень си-шных функций, ну и пошла веселуха)))

Мы ведь говорим про константные литералы, которые компилятор преобразует неочевидным для нас образом. Если их не использовать, то обсуждаемой проблемы попросту нет. А для передачи строк в MQL все равно приходится использовать wchar_t, т. к. std::wstring::c_str() не подходит.