C, C++, грабли
Jul. 11th, 2019 07:28 pmНаступил на грабли. gcc и g++ дают разный размер довольно развесистой структуры, используемой в сишной и плюсовой библиотеках.
Можно ли малой кровью их привести к единому знаменателю? С-шная библиотека не наша, плюсовая наша.
Вроде бы везде стоят флаги
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
Опцию -fpack-struct пробовал, не преуспел.
Update: разные опции сборки базовой и производной библиотек.
Можно ли малой кровью их привести к единому знаменателю? С-шная библиотека не наша, плюсовая наша.
Вроде бы везде стоят флаги
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
Опцию -fpack-struct пробовал, не преуспел.
Update: разные опции сборки базовой и производной библиотек.
no subject
Date: 2019-07-15 08:03 am (UTC)Это часть стандарта?
no subject
Date: 2019-07-15 12:31 pm (UTC)Что значит «в связке с Си»? Стандарты C и C++ не специфицируют точное представление типов, оставляя это на откуп реализации. Реализации же в большинстве своём делают в соответствии с ABI платформы. Раскладывать плюсовую структуру совместимо с аналогичной сишной — в большинстве случаев достаточно экономично по памяти и быстродействию и выгодно для interoperability.
Плюсовые структуры, удовлетворяющие требованиям на plain old data (C++11 [class]#6–10), будучи побайтово скопированы в байтовый буфер, а затем обратно в память, занятую экземпляром той же самой структуры — остаются валидными объектами, почленно равными исходным (C++11 [basic.types]#2). Указатель на POD-структуру численно равен указателю на её первое поле (C++11 [class.mem]#17–20). Да, здесь нет явного разрешения копировать полученный извне байтовый массив в underlying bytes структуры и рассчитывать на правильную интерпретацию; это, на самом деле, к ABI.