Позволяет ли связывание C С C++ избежать неопределенного поведения, которое является законным в C, но не C++?



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



В бла.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.СРР (скомпилированные с помощью компилятора C++)



#include "blah_if.h"

...

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


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



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



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

546   2  

2 ответов:

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.