#c #templates #embedded
#c #шаблоны #встроенный
Вопрос:
Я работаю над парой проектов, которые включают общий код. Проекты выполняются с использованием разных ядер со следующими отличиями:
typedef long long i64;
// typedef unsigned long long u64; // In project A
// typedef unsigned long u64; // In project B
typedef int i32;
typedef unsigned int u32;
typedef short i16;
typedef unsigned short u16;
typedef char i8;
typedef unsigned char u8;
typedef void* Data;
// typedef u32 ptr; // 32b pointer in project A
// typedef u64 ptr; // 64b pointer in project B
Но, конечно, я хочу поддерживать новые ядра в будущем с другой конфигурацией.
Я не специалист по OOO, поэтому я вижу следующие способы справиться с этим:
1) Создайте 2 копии «ProjDefs.h» и включите его отовсюду в проект (в проекте A «ProjDefs.h» будет иметь другое содержимое, чем проект B). Я считаю, что это неправильный способ (но это то, что делают все в моем отделе).
2) Иметь каждый класс для наследования от «Object.h», который будет применять эти конкретные типы, и иметь следующий код:
template <typename Core>
class EV_Object{
typename Core::I64 I64;
typename Core::U64 U64;
typename Core::I64 I32;
typename Core::I64 U32;
typename Core::I64 I16;
typename Core::I64 U16;
typename Core::I64 I8;
typename Core::I64 U8;
typename Core::Ptr Ptr;
};
Пусть каждый класс наследует от него, получая таким образом правильные определения типов.
Проблема в том:
A) Каждый класс должен наследовать от него.
Б) Поскольку это шаблон, я не смогу использовать исходные файлы (только заголовки).
Опять же, я далек от эксперта по c , но это также кажется неправильным.
Есть предложения?
Спасибо, Офер
Комментарии:
1. как вы думаете, почему 1) неверно?
2. Может быть, вы хотите переключиться на использование стандартных типов вместо этого: en.cppreference.com/w/cpp/header/cstdint
3. кстати, между строк я прочитал, что вы предполагаете, что c expert == OO expert, это не совсем правильно, c — многопарадигмальный язык, и если вы хотите, вы можете вообще не использовать OO (и это не обязательно будет плохой c ). Далее, если 1) — это соглашение, которому следует ваша команда, я не вижу в этом ничего плохого, в то время как наследование каждого объекта от some
Object
— это совершенно недопустимое imho4. Да, простой
#include <stdint.h>
решает эту проблему, не создавая еще одного набора определений типов, которые вызывают повторяющиеся проблемы в коде C (который очень требователен к типам и к тому, из чего определяются определяемые типы) и сталкиваются с другим «плохо» написанным сторонним кодом.5. Сохраняйте привязку к типу данных платформы на базовом уровне, возможно, в целевом уникальном, непосредственно выбранном вашей целевой логикой сборки; тогда вы сможете совместно использовать его не только с модулями C , отличными от OO, но и с любым кодом C, который вам может понадобиться для использования.
Ответ №1:
Что вам абсолютно необходимо сделать, так это отказаться от ваших типов «local garage standard» и использовать stdint.h
вместо этого. Точка.
Да, вам нужно будет изменить всю вашу программу — вините в первую очередь человека, который решил разработать свой собственный стандарт ввода.
Что касается указателей, вы в любом случае не должны скрывать их за typedefs. Если размер самих указателей имеет значение, то это запах кода. Для очень редкого случая, когда размеры указателей действительно имеют значение, используйте sizeof
вместо того, чтобы полагаться на typedefs .