2012-12-21 49 views
3

为了诱发C#/ Java语法,通过预处理命令重新定义C++访问修饰符会有什么影响?重新定义访问修饰符的影响是什么?

#include <iostream> 

// The access modifiers are redefined here. 
#define public public: 
#define protected protected: 
#define private private: 

class Halo 
{ 
    public Halo(int xx) 
    { 
     x = xx; 
    } 

    public int getX() 
    { 
     return x; 
    } 

    private int x; 
}; 

int main() 
{ 
    Halo* halo = new Halo(3); 

    std::cout << halo->getX(); 

    return 0; 
} 
+1

一个会是未定义的行为。我很确定它说在标准中重新定义关键字的地方。 – chris

+0

#1重新定义关键字是(IIRC,可论证)未定义的行为。 #2这不是Java或C#,习惯它。 – GManNickG

+1

C++不是Java。在这里遇到的一个细微问题是内联函数。你应该了解它们是如何工作的,以便你可以在适当的时候有意识地使用它们。 –

回答

9
class B : public A {}; 

expected '{' before ':' token
expected unqualified-id before ':' token
expected class-name before ':' token

3
从语法错误中已经提到的后果

除了。 这样做会让其他人感到困惑。很久以前,人们会在Pascal中编程,然后在移动到C时使用#define BEGIN {#define END },这导致代码看起来像pascal,但在许多其他方面当然不像pascal。

您正在用另一种语言编程。那么为什么假装它不是。

我想这是因为你认为它是Java,你忘了删除你的晕圈对象呢?

2

任何事情都可能发生,因为重新定义语言关键字是未定义的行为。

一般而言,您应该为您使用的语言编写惯用代码。如果您想使用Java/C#语法,只需使用这些语言编写代码即可。