Я наткнулся на некоторый код, который выглядит следующим образом:Условная C/C++ STRUCT определения
typedef struct SomeStruct
{
int foo;
void * bar;
#if defined(__cplusplus)
SomeStruct();
#endif
} SomeStruct;
Это в заголовочном файле, который будет включен как .c и .cpp файлов. По-видимому, это, по крайней мере, технически является нарушением правила Единого определения. Очевидное влияние, которое я вижу, это то, что если один из них объявлен в .c файле, конструктор не будет работать. И, к сожалению, кто-то, похоже, использовал это как шаблон для правильного способа объявления структур и объявил пару десятков структур, подобных этому.
Я пытаюсь выяснить, насколько серьезной является проблема. Возможно, что помимо конструктора не работает, есть ли другие возможные последствия? Конструктор реализован в файле .cpp. Я вижу указатели на структуры, созданные в .c файле (с malloc), которые передаются в функции в .cpp-файлах. Насколько мне известно, они работают корректно (скомпилировано с gcc/g ++ 4.6.2 для Suse Linux, если это имеет значение). Разве что-то сломается, если будут добавлены функции виртуального члена? Прямо сейчас ни один из этих классов не имеет ничего в своем разделе cplusplus, кроме конструктора по умолчанию, как показано выше.
Виртуальные функции, безусловно, сломают код. Они требуют дополнительного хранения внутри структуры (так называемый * vtable pointer *). – HolyBlackCat
Добавление символа 'char * empty;' в начале 'struct' может помочь вам добавить виртуальную функцию, хотя это довольно ужасное решение. –