C++基准,是否允许两个互不可见的类重名

C++标准,是否允许两个互不可见的类重名?
以下是一个测试程序,编译器是 VS2010

test1.cpp:

C/C++ code

class Cs
{
public:
    int test()
    {
        return 1;
    }
    int test1()
    {
        return 10;
    }
};

int test1()
{
    return Cs().test() + Cs().test1();
}



test2.cpp:

C/C++ code

class Cs
{
public:
    int test()
    {
        return 2;
    }
    int test2()
    {
        return 20;
    }
};

int test2()
{
    return Cs().test() + Cs().test2();
}



main.cpp:

C/C++ code

#include <stdio.h>
#include <stdlib.h>

int test1();
int test2();

int main()
{
    printf("%d %d\n", test1(), test2());
    system("pause");
    return 0;
}



输出结果竟然是的:11 21


疑问:

1、同一个编译模块中,C++标准是否允许两个类重名,或者这个根本不是标准的一部分?
2、出现这样的情况是不是MS链接器的BUG?
3、如果C++标准允许类重名,链接器也没有问题,那这算不算是C++标准的一个缺陷?


------解决方案--------------------
实际上,C++标准或者说大概所有的语言标准,都只规定了“如果你这么写,那么我可以保证得到什么结果”
正确的行为是有限的,错误的行为是无限的,C++标准可以明确规定其中一些行为是不允许的,但更多的错误行为不可能被全部包罗进来,甚至有些行为标准委员会可能都想不到。这类错误行为,我们称为“未定义”
未定义行为会得到什么样的结果,取决于具体处理这段代码的编译器,也许你用MS的编译器会得到某种结果或者报错,用G++又会得到另一种结果或者报错,诸如此类

通过编译器的编译不代表就是正确代码,C++标准没规定不可以写不代表就可以写

如果上面这些话楼主都不爱听,觉得是废话,那就说点也许有用的
别为难编译器,你敢为难编译器,编译器就敢玩死你
编译器只负责把你的代码转换成机器命令,如果你们之间发生了矛盾,到底是谁倒霉?我想比尔盖茨不会在意你的老板对你编写的程序发火拍桌子甚至找人事部。
只写你确定你知道会得到什么结果的代码

好吧,我承认我完全不熟悉C++标准原文
楼主提出的这类问题,我向来是按照上面的原则回避掉的
等高人回答吧,记得这里有几个标准党,是我等小白的福音
------解决方案--------------------
探讨
为什么不是 11 22 ?

------解决方案--------------------
test1.cpp和test2.cpp都是编译单元,并且其中的Cs互不可见,并不会对编译产生影响。所以代码产生结果的问题应该是在链接环节上,受链接器内部工作原则和细节决定,例如test1.obj和test2.obj在链接是会不会发生合并,或者根据链接顺序具有优先级?不得而知。
------解决方案--------------------
推测是链接顺序的问题。
如果
g++ -o demo main.cpp test1.cpp test2.cpp
输出就是11, 21, Cs.test()首先在test1.cpp里找到所以Cs.test()返回1

如果
g++ -o demo main.cpp test2.cpp test1.cpp
输出就是12, 22, Cs.test()首先在test2.cpp里找到所以Cs.test()返回2

------解决方案--------------------
第一,就这么几行代码,怎么可能出现重名问题而不能发现?
第二,如果代码量很巨大,那么在使用上就不可能像这几行代码这样这么随意,如果你把类声明都include进来,编译时就发现问题了。
第三,c++提供了命名空间。

最后,我们不要把精力花在毫无意义的假设和对这毫无意义的假设进行求证之上。
------解决方案--------------------
我给楼主提供一条思路。因为如果以楼主这样在test1.cpp与test2.cpp2个CPP文件里面定义不加任何修饰的text()函数,会使test1.cpp里面的text()函数在链接时覆盖掉test2.cpp里面的text(),于是就得出楼主的结果。你可以声明text()为虚函数(virtual text())这样有可能会得到楼主想要的结果。
//都声明为虚函数 结果是12 22.
//2个text函数只声明一个为虚函数 结果为 11 22.我想这个应该是楼主想要的答案。这样两个text函数就互不干扰了。
//都不声明为虚函数 结果就是楼主的结果。

------解决方案--------------------
这样的问题我觉得在事先就该规划好,防止隐患吧
------解决方案--------------------
在类声明中写实现的话则 函数就是inline的函数 ,而inline函数也会存在当前编译单元符号表中。

编译器会保证 同样函数签名的inline函数不会链接冲突。

如果有两个不一样实现的inline函数,那么编译器就就自己决定用哪个实现,所以inline函数都会写在头文件中保证在每个编译单元中实现一致。

------解决方案--------------------
探讨
1、同一个编译模块中,C++标准是否允许两个类重名,或者这个根本不是标准的一部分?
2、出现这样的情况是不是MS链接器的BUG?
3、如果C++标准允许类重名,链接器也没有问题,那这算不算是C++标准的一个缺陷?