gpt4 book ai didi

c++ - 带有 C++ 的 extern C 是否避免了在 C 中合法但在 C++ 中不合法的未定义行为?

转载 作者:IT老高 更新时间:2023-10-28 22:33:18 32 4
gpt4 key购买 nike

如果您将 extern C 与 C++ 文件一起使用,是否允许在 C++ 中未定义的已定义 C 行为?

废话.h

 extern "C"
{
struct x {
int blah;
char buf[];
};

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

some_random.cpp

 #include "blah.h"

...

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

是在C的灵活数组成员中使用定义的行为,这样使用时定义的行为?

最佳答案

灵活的数组成员是 C 的标准特性,从 1999 年标准开始。它们在 C++ 中不存在。

您的代码不是有效的 C++。将其包装在 extern "C" 中并不会改变这一点。符合标准的 C++ 编译器必须至少发出警告,并且可以说应该拒绝它。

碰巧 g++ 实现了 C 风格的灵活数组成员作为 C++ 的扩展。这是完全合法的(允许编译器实现扩展),但它的使用是不可移植的。它的行为,就像任何语言扩展一样,是由编译器定义的,而不是由语言定义的。

如果你用 g++ -pedantic 编译它,你会得到一个警告:

c.cpp:5:21: warning: ISO C++ forbids zero-size array ‘buf’ [-Wpedantic]
char buf[];
^

如果您想在 C++ 程序中使用 C 风格的灵活数组成员而不依赖于特定于编译器的扩展,您可以将您的 C 代码编译为 C 并将其链接到您的 C++ 程序中。您不能使具有灵活数组成员的类型对您的 C++ 代码可见,但您可以在 C 代码内部使用它,并且可能通过不透明指针在您的 C++ 代码中提供对它的访问。见 the C++ FAQ有关在同一程序中混合 C 和 C++ 的信息。 (或者你可以只使用 g++ 扩展,代价是不能用其他编译器编译你的代码。)

(我假设您使用的是 g++。其他一些编译器可能实现了类似的扩展。)

关于c++ - 带有 C++ 的 extern C 是否避免了在 C 中合法但在 C++ 中不合法的未定义行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31881811/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com