Что значит ## в #define?

(Извините, я не могу опубликовать это как «комментарий» к ответу Питера Кордеса из-за примеров кода, поэтому я должен опубликовать это как «ответ».)

Созданы старые компиляторы C ++ C вместо кода сборки. Следующий класс:

class foo {
  int m_a;
  void inc_a(void);
  ...
};

... приведет к следующему C-коду:

struct _t_foo_functions {
  void (*inc_a)(struct _class_foo *_this);
  ...
};
struct _class_foo {
  struct _t_foo_functions *functions;
  int m_a;
  ...
};

«Класс» становится «структурой», «объект» становится элемент данных типа struct. Все функции имеют дополнительный элемент в C (по сравнению с C ++): «этот» указатель. Первый элемент «struct» - это указатель на список всех функций класса.

Итак, следующий код C ++:

m_x=1; // implicit this->m_x
thisMethod(); // implicit this->thisMethod()
myObject.m_a=5;
myObject.inc_a();
myObjectp->some_other_method(1,2,3);

... будет смотреть следующий путь в C:

_this->m_x=1;
_this->functions->thisMethod(_this);
myObject.m_a=5;
myObject.functions->inc_a(&myObject);
myObjectp->some_other_method(myObjectp,1,2,3);

Используя эти старые компиляторы, код C был переведен на ассемблерный или машинный код. Вам нужно только знать, как обрабатываются структуры в коде ассемблера и как обрабатываются обращения к указателям на функции ...

Хотя современные компиляторы больше не конвертируют код C ++ в код C, полученный в результате код ассемблера по-прежнему выглядит одинаково как если бы вы сначала выполнили шаг C ++-to-C.

«new» и «delete» приведет к вызову функций для функций памяти (вместо этого вы можете называть «malloc» или «free» ), вызов конструктора или деструктора и инициализация структурных элементов.

30
задан Brian Tompsett - 汤莱恩 28 November 2015 в 14:48
поделиться