3

我创建了两个不同的头文件,每个都包含一个具有相同名称的类,并且每个都包含在不同的 cpp 文件中,因此编译器不会抱怨重新定义它们

它们像两个不同的类一样运行,除了当它们具有相同的方法、相同的名称和相同的参数时,只调用其中一个,例如:

//on first cpp:
#include "same1.h"
//...
SameName obj(int_value);
obj.ok(int_value);
obj.not_ok();

//on second cpp
#include "same2.h"
//...
SameName obj(float_value);
obj.ok(float_value);
obj.not_ok();

在这两个文件上,都调用了来自 same1.h 的 not_ok,当然它还没有正确初始化

我知道问题出在哪里以及为什么会发生这种情况,我也熟悉 Name mangling 并且它们在编译时具有完全相同的名称。

我只想知道这是 C++ 的标准行为还是我的编译器是如何实现的,我的意思是,所有编译器是否应该在这种情况下做同样的事情?

我应该提到我在 Debian Linux 上使用 gcc 4.7.1。

4

3 回答 3

4

这违反了一个定义规则和未定义的行为。

于 2012-08-11T19:46:09.720 回答
3

该标准规定,如果您违反此特定规则,那么您将调用未定义的行为。因此,您的案例没有标准行为。但是您可以期望它不起作用。编译器通过做某事来遵循标准,因为“某事”是“未定义行为”的一部分。

于 2012-08-11T19:50:09.047 回答
2

通过在你的程序中包含同一个类的两个不同定义,你违反了 C++ 的规则。因此,您的程序的行为是未定义的。

于 2012-08-11T19:48:09.600 回答