Я хотел бы избежать, чтобы попасть в XY trap так вот исходная задача:Размер типов C++ с различными компиляторами
У нас есть небольшая программа, которая создает сегмент разделяемой памяти на ПК. Эта программа создает его, читая его структуру из своего файла заголовка (связка индивидуального и вложенного определения структуры). В основном только файл .h и .cpp. Эта программа будет скомпилирована g ++.
Мы хотели бы создать другую программу, средство просмотра общей памяти, которая отображает макет этой памяти в древовидной структуре. Для этого нам нужно проанализировать вышеупомянутый заголовочный файл и вычислить смещения для чтения/управления содержимым определенной части разделяемой памяти. Мы не хотим писать парсер, если это не обязательно, потому что заголовочный файл содержит дополнительные объявления и определения. Эта программа будет скомпилирована той же версией g ++, что и предыдущая программа.
Первоначально мы хотели использовать gccxml во второй программе для анализа файла заголовка, но он основан на 4.2 gcc и не может разобрать включенные заголовочные файлы, содержащие код C++ 11. Другая идея - использовать libclang для получения структуры этого файла заголовка. libclang также содержит информацию о размерах, но я не знаю, является ли размер типов и добавление/выравнивание одинаковым в случае g ++ и clang.
Мой вопрос: можете ли вы предположить, что размер типов C++ и заполнение/выравнивание структур будут одинаковыми при компиляции кода с помощью clang и g ++? Окружающая среда (ПК, ОС) одинакова. Боюсь, мы не можем, потому что стандарт C++ не определяет точные размеры типов.
Вы знаете другое решение исходной проблемы?
почему бы не использовать оригинальный компилятор для создания небольшая программа, которая выводит соответствующие смещения данных и размеры данных. –
Я даже не понимаю, почему вы хотите иметь другую программу - почему бы просто не использовать переключатель командной строки для программы «создать» для работы в режиме «печать/управление деревом»? Если вы настаиваете на второй программе - поместите определения классов в заголовок (если их еще нет) и включите вторую программу. Разумеется, с определениями структуры/класса. нетрудно снова подключиться к сегменту разделяемой памяти и создать указатели struct/class для интерпретации содержимого памяти с помощью ...? –