Предположим, у меня есть тип в заголовке, используемый кодом 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