缺少类函数声明是否安全?

时间:2014-04-02 13:54:27

标签: c++

我总是想知道这一点(尽管应用程序最多也是有限的)。

我有以下课程:

//a.hpp
class A
{
public:
#ifdef FOO
    int foo();
#endif
};

库(静态或共享)定义FOO,但链接的可执行文件不定义。这是有效的C ++吗?如果foo是虚拟的,会发生什么?编译器是否一样?

2 个答案:

答案 0 :(得分:2)

这违反了One Definition Rule,因此它是未定义的行为。事实是,因为该功能是非虚拟的,并且应用程序不能依赖它...而且,未定义的行为可能会显示为工作,但程序没有明确定义。

在评论丹尼尔的回答时,你说:

  

如果它是虚拟的,它是否仍然正确地在vtable中被初始化,并且没有人可以使用A :: foo的指针?

如果函数是虚函数,那么未定义行为在代码中以不同方式显现的可能性更大:

如果它是唯一的虚拟功能

程序的两个部分所看到的对象的内存占用量会有所不同,内存保留以及该内存的使用会有所不同。

如果它不是唯一的虚拟功能

对象的内存占用量相同,但是 vtable中每个函数的位置对于程序的不同部分将是不同的,这可能导致调用错误的函数和各种各样的问题。

答案 1 :(得分:0)

预处理程序指令仅对编译器有效,而不对链接阶段有用。在编译库时,要么定义了FOO,要么定义了FOO。编译后的代码就是这样,如果你链接到它,你将只能使用编译它时存在的函数。