缺少类函数声明是否安全
Is it safe to have missing class function declarations?
我一直想知道这一点(尽管应用程序充其量是有限的)。
我有以下课程:
//a.hpp
class A
{
public:
#ifdef FOO
int foo();
#endif
};
库(静态或共享)定义 FOO,但链接的可执行文件则不定义。这是否有效C++?如果 foo 是虚拟的会发生什么?编译器之间是否相同?
这违反了一个定义规则,因此它是未定义的行为。 事实是,因为该功能是非虚拟的,应用程序不能依赖它,并且......好吧,未定义的行为可能会显示为工作,但程序没有明确定义。
在对丹尼尔回答的评论中,你说:
如果它是虚拟的,它是否仍然在 vtable 中正确启动,只是没有人可以接受 A::foo 的指针?
如果函数是虚拟的,那么未定义的行为更有可能以不同的方式在代码中显现出来:
如果它是唯一的虚拟函数
程序的两个部分看到的对象内存占用量将不同,保留的内存和该内存的使用将不同。
如果它不是唯一的虚拟功能
对象的内存占用将是相同的,但是对于程序的不同部分,vtable 中每个函数的位置会有所不同,这可能会导致对错误函数的调用和各种问题。
预处理器指令只对编译器重要,对链接阶段无关。在编译库时,要么定义 FOO,要么未定义。编译后的代码就是这样,如果你链接到它,你将只能使用编译它时存在的函数。
相关文章:
- 通过网络、跨平台传递std::变体是否安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 在函数结束后使用指向变量的指针是否安全?
- 逐字节删除 void* 是否安全?
- 在 RAII 构造中修改 RVO 值是否安全?
- 线程调用的函数对对象删除是否安全?
- 将对象的字节复制到数组并再次复制回来是否安全
- 使用枚举为数组编制索引是否安全?
- 返回从字符串文本创建的静态string_view是否安全?
- 在cstlib中将#include_next替换为#include是否安全
- 由并发无序映射查找线程调用的函数是否安全?
- 使用 c++ 原子时编写"y=++x"是否安全?
- 从另一个线程发出信号是否安全?
- 从其存储的回调中删除 std::函数是否安全
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 同时调用 ASIO 对象的 API 是否安全?
- 使用自己的迭代器分配容器是否安全?