2012-02-02 17 views
7

Estoy diseñando una API C que, entre otras cosas, tiene que proporcionar una manera de establecer algunas opciones de doble valor. Para identificar las opciones que utilizo la siguiente enumeración:¿Es una buena idea usar un parámetro enum en la función API pública en C?

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

¿Es una buena idea usar Option como un tipo de parámetro en una función de la API pública:

int set_option(Option opt, double value); 

o es mejor utilizar int vez :

int set_option(int opt, double value); 

teniendo en cuenta que es posible que tenga que agregar más opciones en el futuro?

También hay buenos ejemplos de API existentes que demuestran cualquiera de los enfoques?

Respuesta

6

Al utilizar un enum está ayudando efectivamente al usuario de su función a saber qué valores válidos están disponibles. Por supuesto, el inconveniente es que cada vez que se agrega una nueva opción, tendrá que modificar el encabezado y, por lo tanto, el usuario puede necesitar volver a compilar su código, mientras que si es un int, puede que no tenga que hacer eso.

+0

Requerir que el usuario recompile su código me preocupa más. ¿Hay alguna forma de evitarlo al agregar nuevas opciones en el primer enfoque (con enum como parámetro)? – vitaut

+2

¿Por qué agregar nuevas opciones para una nueva compilación? El viejo código todavía funcionaría. Si desea acceder a la nueva característica, no es irracional solicitar una nueva compilación. Y si usaste y int en su lugar, entonces lo definirías como una constante en tu archivo de encabezado para que allí también haya una recompilación. –

+0

Uno podría plantear el punto bastante obvio de que * para usar * el nuevo valor, uno tiene que cambiar y volver a compilar ese código de todos modos. Agregar un nuevo valor enum no requeriría la recompilación de ningún código existente. –

1

Las enumeraciones le dan la ventaja del tiempo de compilación comprobando que el valor es sensato. Luego, deberá agregar las nuevas opciones a una nueva versión de su archivo de encabezado si agrega opciones en el futuro.

+0

¿Cómo es eso? C parece aceptar felizmente cualquier entero al llamar a una función que espera un parámetro enum. (Al menos con las advertencias que están habilitadas por defecto en un proyecto de XCode). – millimoose

+2

Debe estar pensando en algún otro idioma. C enums son solo enteros. Sin seguridad de tipo real en absoluto. –

+1

Definitivamente, he visto que los compiladores generan advertencias al pasar los enteros como enumeraciones cuando int no cae en el rango enum declarado. Tal vez es simplemente una cosa agradable opcional para los compiladores para advertir? – TJD

Cuestiones relacionadas