2012-09-02 139 views
-3

有人可以给我一个例子,我们真的需要枚举作为函数中的参数吗?在C/C++中作为函数的参数枚举

+3

您如何区分“需要”和“真正需要”? –

+1

我想你可以通过问一个不同的问题来帮助自己。使用枚举作为函数参数的原因与在代码中的其他任何地方使用枚举的原因相同。 –

+1

“真需要”太强大;你永远不会这样做,但使用它们可以使你的代码更清晰,更容易维护,并且更少出错(尤其是在C++中) – Clifford

回答

2

不需要枚举,但它们使软件更具可读性。例如:

void write(const std::string&, bool flush); 

现在主叫方:

write("Hello World", true); 

如果枚举已经使用,它变得更清楚什么样的第二个参数是指主叫方:

enum flush_type { flush, no_flush }; 
void write(const std::string&, flush_type flush); 

并再次呼叫方:

write("Hello World", flush); 
+1

不是,枚举的使用限制了你可以作为函数参数传递给枚举值。 – juanchopanza

+0

@juanchopanza:没错。该功能对未预料到的价值有什么作用?枚举有助于阐明函数的设计目的。 –

+0

@PontusGagge,并可能强制编译器错误,如我的答案中的示例。 – juanchopanza

3

除了使代码更清晰,在C++中,它强制在编译的时候,一个功能一个工作出一组可能值:

namespace Foo 
{ 
enum Bar { A, B, C }; 

void foo(Bar b) { .... } 
void foo2(int i) { /* only ints between 0 and 5 make sense */ } 
} 


int main() 
{ 
    Foo::Bar b = Foo::A; 
    Foo::foo(b); // OK 
    Foo::foo(245); // Compile-time error! 
    Foo::foo2(6); // Compiles, triggering some run-time error or UB 
} 
+0

对于C++而言,不是C的,它不强制对枚举类型进行类型检查。然而,C编译器可能会发出警告,但可能不会如此处所述:http://stackoverflow.com/questions/8597426/enum-type-check-in-c-gcc – Clifford

+0

@Clifford感谢您指出了这一点。我没有意识到问题是关于两种不同的语言,这是无稽之谈。 – juanchopanza

+0

“废话”可能有点强烈 - 语言的语法有相同的语法并且可以互操作,但对于相同的语法假设相同的语义可能是天真的,但并非不合理 - 它们并不相同。 – Clifford

0

按钮功能的setColor,需要得到参数的颜色,应该是枚举。

+0

请注意,每个枚举都等价于机器语言中的常量 – LeeNeverGup