Подтвердить что ты не робот

Связывает ли C с С++ поведение undefined, которое является законным в C, но не С++?

Если у вас есть C файл, скомпилированный с компилятором C и определяющий поведение для C, но не С++, можете ли вы связать его с С++ файлом и не иметь поведение undefined?

в blah.c(файл скомпилирован как C)

struct x {
    int blah;
    char buf[];
};

extern char * get_buf(struct x * base);
extern struct x * make_struct(int blah, int size);

blah_if.h

extern "C"
{
    struct x;

    char * get_buf(struct x * base);
    struct x * make_struct(int blah, int size);
}

some_random.cpp(скомпилирован с компилятором С++)

#include "blah_if.h"

...

x * data=make_struct(7, 12);
std::strcpy(get_buf(data), "hello");

Использует определенное поведение в элементе C гибкого массива в файле, скомпилированном с компилятором C, определяется поведение при использовании файла, скомпилированного как С++ и связанного с объектом из компилятора C?

Обратите внимание, что поскольку используется компилятор C и struct x непрозрачен, это отличается от:

Предоставляет ли extern C с С++ поведение undefined, которое является законным в C, но не С++?

4b9b3361

Ответ 1

Как уже сказал Раймонд, это определяется реализацией на формальном уровне языка.

Но важно помнить, что такое скомпилированный код. Это не С++-код, и это не C-код. Правила поведения кода на этих языках относятся к коду, написанному на этих языках. Они учитываются во время процесса синтаксического анализа и перевода. Но, как только ваш код был переведен на сборку или машинный код или что бы вы еще не перевели, эти правила больше не применяются.

Так что просто бессмысленно спрашивать, имеет ли скомпилированный код C UB. Если у вас была четко определенная программа на языке C и скомпилирована она, то это. Вы не вправе обсуждать, хорошо ли определена компилированная программа или нет. Это бессмысленное различие, если только вам не удалось создать программу, которая продиктована UB спецификацией для вашего диалекта сборки или машинного языка.

Итогом всего этого является то, что предпосылка вашего вопроса необоснованна. Вы не можете "избегать поведения undefined" при связывании с скомпилированным результатом программы C, потому что само понятие "undefined поведение" там не существует. Но , если исходный код был корректно определен при его переводе, вы будете в порядке.

Ответ 2

Поведение определяется реализацией.

[dcl.link] Связывание из С++ с объектами, определенными на других языках, и объектами, определенными на С++ с других языков, зависит от реализации и зависит от языка.

Он продолжает:

Только там, где стратегии размещения объектов двух языковых реализаций достаточно схожи, такая связь может быть достигнута.

Это предложение в стандарте действительно должно быть аннотацией, поскольку оно не указывает, что считается "достаточно похожим".