2012-02-02 10 views
7

私はいくつかの二重の値を設定する方法を提供しなければならないC APIを設計しています。Cの公開API関数でenumパラメータを使用することをお勧めしますか?

typedef enum 
{ 
    OptionA, 
    OptionB, 
    ... 
} Option; 

それが公共のAPI関数のパラメータ型としてOptionを使用することをお勧めします:

int set_option(Option opt, double value); 

またはそれがより良い代わりにintを使用することです、私は、次の列挙型を使用するオプションを識別するために、 :

int set_option(int opt, double value); 

私は将来さらにオプションを追加する必要があると考えていますか?

いずれのアプローチを示す既存のAPIの良い例もありますか?

答えて

6

enumを使用すると、有効な値がどのような値であるかを関数のユーザーが効果的に知ることができます。 もちろん、新しいオプションが追加されるたびにヘッダーを変更する必要があるため、ユーザーはコードを再コンパイルする必要がありますが、intの場合は、コードを再コンパイルする必要があります。

+0

ユーザーにコードを再コンパイルすると、ほとんどのことが心配です。最初のアプローチ(enumをパラメータとして)で新しいオプションを追加するときに回避する方法はありますか? – vitaut

+2

なぜ再コンパイルのための新しいオプションを追加するのですか?古いコードは引き続き動作します。新しい機能にアクセスしたい場合は、再コンパイルを依頼することは不合理ではありません。そしてあなたが代わりにintを使用した場合は、それをヘッダーファイルの定数として定義して、再コンパイルすることもできます。 –

+0

新しい値を使用するためには、そのコードを変更して再コンパイルする必要があるという明白な点があるかもしれません。新しいenum値を追加しても、既存のコードを再コンパイルする必要はありません。 –

1

列挙型を使用すると、コンパイル時に値が正常であることを確認できるという利点があります。将来、オプションを追加する場合は、ヘッダファイルの新しいバージョンに新しいオプションを追加する必要があります。

+0

どのようにですか? Cは、enumパラメータを必要とする関数を呼び出すときに、任意の整数を喜んで受け入れるようです。 (少なくとも、XCodeプロジェクトではデフォルトで有効になっている警告があれば。) – millimoose

+2

あなたは他の言語を考える必要があります。 Cの列挙型は単なる整数です。実際のタイプの安全性はまったくありません。 –

+1

intがenum宣言された範囲に含まれていないときに、intをenumとして渡すときに、コンパイラが警告を生成するのは間違いありません。たぶん、コンパイラが警告するのはオプションの素晴らしいことでしょうか? – TJD

関連する問題