我正在编写一个库来加载和保存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 *。
答案 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()
语句。