Безопасно ли условно добавлять конструкторы в класс, используемый как в C++, так и в C?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Безопасно ли условно добавлять конструкторы в класс, используемый как в C++, так и в C?

Сообщение Anonymous »

Предположим, у меня есть тип в заголовке, используемый кодом C/C++, который выглядит следующим образом:

Код: Выделить всё

 typedef struct Point
{
double X, Y, Z;
} Point ;
Обычно он выделяется в стеке, вот так.

Код: Выделить всё

Point point;
memset(&point, 0, sizeof(point));
Эта инициализация чаще всего выполняется в коде C++ и лишь в редких случаях в коде C. Однако C-код все еще должен знать об этом типе, поскольку C-код выполняет над ним операции.
например,

Код: Выделить всё

C_API void mutatePoint(Point *point);
< /code>
Поэтому мой вопрос: безопасно ли добавить условный C ++-конструктор, чтобы избежать необходимости вызывать MEMSE каждый раз? < /p>
 typedef struct Point
{
double X, Y, Z;
#ifdef __cplusplus
Point() { X = Y = Z = 0.0; }
Point(double x, double y, double z) { X = x; Y = y; Z = z; }
#endif
} Point;
< /code>
Это упростило бы инициализацию и использование в C ++-код: < /p>
Point point;
mutatePoint(&point); // Already set to (0, 0, 0) due to constructor, no need to memset first
Когда я говорю о безопасности, я имею в виду, нарушает ли это какие-либо C/C ++-такие правила, как ODR? Или это можно было бы сделать. Я в порядке с этим не рекомендуется, и я также в порядке, когда я слышу какие -либо входные данные о том, почему это не будет рекомендовано. Существует правило, которое явно позволяет/отменить это. Я могу подтвердить, что такой код, скомпилированный с работами MSVC, по -видимому, в порядке, и сделал это в течение многих лет.

Подробнее здесь: https://stackoverflow.com/questions/793 ... th-c-and-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»