我正在写一个库来加载和保存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函数:
void jmpr_savePNM(char* filename, jmpr_Image* img, enum jmpr_PNMMode mode)
{

}

现在如何检查得到的枚举的不同实例?它不适用于:
if (strcmp(mode, "ASCII_PPM") != 0)

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

最佳答案

此代码:

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()语句。

10-06 14:17
查看更多