2010-02-10 81 views
1

现在不用C++编写代码,但是当我在C#中遇到问题时出现了一个问题。希望这里的专家能够轻松地给出一个答案。C++,#ifdef问题

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

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

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

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

+0

这是使用'#if'描述特定特定代码的复杂性的一个例子。类“B”和“C”需要使用相同的“#if”。因此它使用'A :: methodA()'传播到任何代码片段。这就是噩梦的开始和企业利润的浪费。另一个喜欢功能替换(通过链接器)(或包括所有代码和使用配置数据文件)的原因。 – 2010-02-10 19:51:33

回答

9

会出现编译错误。

+0

+1更快的手指 – 2010-02-10 17:20:12

3

A类不会有methodA,所以编译B类或C类将会失败。

0

如果没有定义AFlag,类A不会有一个成员函数methodA(),所以在B类中调用它,C会有误差。

0

你会看到一个编译错误,因为在了methodA不上A级定义

1

你将有一个编译器错误的方法,为methodA不被任何声明的功能。你可以使用这个语法来代替:

Class A{ 

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

} 

,这将使methodA中声明/定义,但如果你把优化它的服务将被优化掉。

4

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

+0

+1包括关键点:预处理器在源文件中有一个* BEFORE *编译器甚至可以看到它。编译器从来没有机会看到任何预处理符号。 – 2010-02-10 17:46:34

1

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

您会在行a.methodA();处收到编译错误(或者如果代码被分割到多个翻译单元中,并且类A的定义不一致),则会发生编译错误。调用函数意味着它必须在那里。如果该函数不存在,则该调用不会被“忽略”。