C ++,#ifdef问题

时间:2010-02-10 17:17:55

标签: c++

现在没有用C ++编码,但是当我在C#中有问题时出现了一个问题。希望这里的专家可以很容易地给出一个灵感。

Class A{
  #ifdef AFlag
  public void methodA(){...}
  #endif
}

Class B{
...
  A a;
  a.methodA();
...
}

Class C {
...
  A a;
  a.methodA();
...
}

如果没有在任何地方定义AFlag,会发生什么?编译错误或没有错误,但方法A和那些调用该方法的语句将不会被编译? 感谢

7 个答案:

答案 0 :(得分:9)

会出现编译错误。

答案 1 :(得分:4)

预编译在编译之前发生。当您的代码进入编译器时,将删除A类中方法A的定义。实际上就像你从未写过它一样。所以这会导致编译错误。

答案 2 :(得分:3)

A类没有methodA,因此编译B类或C类将失败。

答案 3 :(得分:1)

您将遇到编译器错误,因为函数methodA未在任何地方声明。您可以改用此语法:

Class A{ 

  public void methodA()
  {
#ifdef AFlag 
    ...
#endif 
  } 

} 

这将允许methodA被声明/定义,但如果您启用优化,它将被优化掉。

答案 4 :(得分:1)

很难确定,因为“......”中的代码可能会影响答案,或者意味着我误解了这个问题。声明a.methodA();必须在函数体中。

您将在行a.methodA();处获得编译错误(如果代码被分割为多个翻译单元,并且A类定义不一致,则可能会出现链接器错误)。调用函数意味着它必须在那里。如果该功能不存在,则不会“忽略”该呼叫。

答案 5 :(得分:0)

如果未定义AFlag,则类A将不会有成员函数methodA(),因此在类BC中对其进行调用将是错误。

答案 6 :(得分:0)

您会看到编译错误,因为方法methodA未在A类上定义。