枚举作为c函数中的参数

时间:2017-11-15 17:07:14

标签: c enums

我正在编写一个库来加载和保存ascii和二进制图像。我定义了一个包含4个不同标志的枚举,用于保存位图的4种不同方法:

enum jmpr_PNMMode
{
    BINARY_PPM,             /* Binary Portable Pixmap (P6)  */
    ASCII_PPM,          /* Portable pixmap ASCII (P3)   */
    BINARY_PGM,         /* Portable Graymap binary (P5) */
    ASCII_PGM            /* Portable Graymap ASCII (P2) */
};

我将这些作为参数传递给我的save-function:

void jmpr_savePNM(char* filename, jmpr_Image* img, enum jmpr_PNMMode mode)
{

}

现在我如何查看我得到的枚举的哪个不同实例?它无法使用:

if (strcmp(mode, "ASCII_PPM") != 0)

因为第二个参数在技术上不是char *。

3 个答案:

答案 0 :(得分:4)

strcmp用于字符串。 enum实际上是一种int,因此mode == ASCII_PPM将是正确的比较方式

6.7.2.2枚举说明符

  

枚举器列表中的标识符声明为具有int 类型的常量,并且可能出现在允许的位置。

答案 1 :(得分:3)

枚举不是字符串,所以你不应该使用strcmp。它们基本上是整数。您需要将if语句更改为...

if (ASCII_PPM == mode)

或者您可以使用switch语句,例如

switch (mode)
{
    case ASCII_PPM:
        ProcessAsciiPpm();
        break;

    case BINARY_PPM:
        ProcessBinaryPpm();
        break;

    default:
        break;
}

答案 2 :(得分:1)

此代码:

enum jmpr_PNMMode
{
    BINARY_PPM,             /* Binary Portable Pixmap (P6)  */
    ASCII_PPM,          /* Portable pixmap ASCII (P3)   */
    BINARY_PGM,         /* Portable Graymap binary (P5) */
    ASCII_PGM            /* Portable Graymap ASCII (P2) */
};

为4个整数提供有意义的名称,其中BINARY_PPM为0,每个后续行将该数字递增1。

所以被调用函数中的代码可以使用:

if ( BINARY_PPM == mode )
    ...
else if( ASCII_PPM == mode )
    ...
else if( BINARY_PGM == mode )
    ...
else if( ASCII_PGM == mode )
    ...
else
{
    perror( "invalid mode sent to jmpr_savePNM()" );
    exit( EXIT_FAILURE );
}

或可能正在使用:

switch( mode )
    case BINARY_PPM: 
        ...
        break;

    case ASCII_PPM:
        ...
        break;

    case BINARY_PGM:
        ...
        break;

    case ASCII_PGM:
        ...
        break;

    default:
        perror( "invalid mode sent to jmpr_savePNM()" );
        exit( EXIT_FAILURE );
        break;
} // end switch()

为了清楚代码和易于阅读和理解,我会使用switch()语句。