现在没有用C ++编码,但是当我在C#中有问题时出现了一个问题。希望这里的专家可以很容易地给出一个灵感。
Class A{
#ifdef AFlag
public void methodA(){...}
#endif
}
Class B{
...
A a;
a.methodA();
...
}
Class C {
...
A a;
a.methodA();
...
}
如果没有在任何地方定义AFlag,会发生什么?编译错误或没有错误,但方法A和那些调用该方法的语句将不会被编译? 感谢
答案 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()
,因此在类B
和C
中对其进行调用将是错误。
答案 6 :(得分:0)
您会看到编译错误,因为方法methodA未在A类上定义。