Мне нужно изменить порядок членов моего класса C ++. Например:
class B {
public:
int i;
int j;
int k;
...
};
становится
class B {
public:
int j;
int k;
int i;
...
};
Проблема в том, что в моих больших кодовых базах есть странные коды, которые зависят от относительного расположения членов класса. Например, некоторые функции предполагают, что адрес члена j меньше адреса члена k.
Есть ли какой-либо инструмент CASE, который может помочь мне идентифицировать любой код, который читает адрес члена класса?
Я не знаю ни одного инструмента, который решит вашу проблему, но я бы определил класс, который поддерживает все операторы для int
тип и который перегружает оператор амперсанда, так что результат оператора не может быть приведен к указателю. Тогда я бы использовал этот класс вместо int
в определениях членов вашего класса и посмотрите на места, где компилятор дает ошибки.
Что-то вроде
class IntWrapper {
public:
IntWrapper() { }
IntWrapper(const int x) { } // don't care about implementation as we
operator int() const { return 0; } // want compile-time errors only
IntWrapper& operator ++() { return *this; }
IntWrapper& operator ++(int) { return *this; }
...
void operator &() const { } // make it void so it would cause compiler error
};
А потом:
class B {
public:
IntWrapper i;
IntWrapper j;
IntWrapper k;
...
};
Это не поможет против использования boost::addressof
функция или какая-то грязная reinterpret_cast
ссылки, но addressof
вероятно, никогда не используется в вашем проекте, а также reinterpret_cast<char&>
трюк (кто бы использовал его для простых целых чисел?).
Вы также должны позаботиться о том, чтобы взять адрес всего объекта B
учебный класс.
Других решений пока нет …