编写像C#这样的代码是否合法?

Div*_*ero 3 c++

例:

H

class MyClass {
    int x,y,z;
public:
    MyClass(int,int,int);
    void X();
    void Y();
    void Z();
};
Run Code Online (Sandbox Code Playgroud)

CPP

class MyClass {
    int x,y,z;
public:
    MyClass(int x,int y,int z) {
        this->x=x;
        this->y=y;
        this->z=z;
    }
    void X() {
        printf("x = %d;\n",x);
    }
    void Y() {
        printf("y = %d;\n",y);
    }
    void Z() {
        printf("z = %d;\n",z);
    }
};
Run Code Online (Sandbox Code Playgroud)

使它像C#一样.不要包含标题,在CPP中重新声明类,但使用方法体.当文件包含标题时,他从CPP获取extern字段\方法等.

这是合法的吗?我无法预测它的问题.有?

Luc*_*ton 11

这属于一元定义规则的范畴.特别是,针对同一个类的单个程序的多个TU上的多个定义的要求是:

[...] - D的每个定义应由相同的令牌序列组成[...]

(3.2定义规则[basic.def.odr]第5段)

因此,即使您"修复"第一个版本以声明成员函数inline与第二个版本匹配(其中提供成员的定义隐式声明它们inline),您仍然会违反此规则:函数体是出现在其中的其他标记一个但不在另一个.

  • @Qnan也许你在我澄清之前已经阅读了我的答案,这里的规则是关于单独TU中的多个定义.ODR在TU级别工作,在程序级别单独工作. (2认同)
  • @Qnan您可以在TU中定义一个类,然后将该定义复制并粘贴到另一个TU中,并且在适当的注意下,您将拥有一个正确的程序.请记住,`#include`机制是根据文本包含来定义的 - 规则确实必须根据我说的工作量身定制.他们是,而且确实如此.从那里开始,如果这两个定义在某种程度上有所不同,那么探究性思维就不会想知道会发生什么.这就是探究心灵问题的答案. (2认同)

Mar*_*k B 5

3.2/5的一个定义规则部分不允许这样做.

类类型可以有多个定义(第9节),...... [其他类型和条件无关紧要]

......并且定义满足以下要求.鉴于这样一个名为D的实体在多个翻译单元中定义,那么

- D的每个定义应由相同的令牌序列组成;

如果标题包含在任何其他链接的翻译单元中,则这明显禁止这种机制.

如果你想编写C#,只需用C#编写即可.如果您编写惯用的C++而不是方言,您的未来维护者将非常感激.