【发布时间】:2013-12-21 14:49:33
【问题描述】:
我正在尝试使用 getsubopt 来解析 C++ 中的一些子选项。我有以下代码。
enum LOG_LEVELS {LOG_QUIET, LOG_NORMAL, LOG_VERBOSE, LOG_DEBUG};
int parse_log_level(char *log_level){
/* Define valid log options. */
char *const log_opts[] =
{
"quiet",
"normal",
"verbose",
"debug",
NULL
}; /* <- First set of warnings */
char* value;
/* Loop through each option and check for valid log options. */
while (log_level != '\0'){
switch (getsubopt (&log_level, log_opts, &value))
{
case LOG_QUIET:
return LOG_QUIET;
break;
case LOG_NORMAL:
return LOG_NORMAL;
break;
case LOG_VERBOSE:
return LOG_VERBOSE;
break;
case LOG_DEBUG:
return LOG_DEBUG;
break;
default:
std::cout << "Only the following log options are valid"
<< std::endl << std::endl << "\tquiet"
<< std::endl << "\tnormal"
<< std::endl << "\tverbose"
<< std::endl << "\tdebug" << std::endl;
return -1;
break;
}
}
}
当我尝试编译时,出现以下错误。
option_parser.cpp: In function 'int parse_log_level(char*)':
option_parser.cpp:35: warning: deprecated conversion from string const to 'char*'
option_parser.cpp:35: warning: deprecated conversion from string const to 'char*'
option_parser.cpp:35: warning: deprecated conversion from string const to 'char*'
option_parser.cpp:35: warning: deprecated conversion from string const to 'char*'
您可能会注意到,我与以下示例中提供的内容有所不同: getsubopt example
即,我使用过:
char *const log_opts[] =
{
"quiet",
"normal",
"verbose",
"debug",
NULL
}; /* <- First set of warnings */
代替我想象的他们的代码版本:
char *const log_opts[] =
{
[LOG_QUIET] = "quiet", /* <- New error */
[LOG_NORMAL] = "normal", /* <- New error */
[LOG_VERBOSE] = "verbose", /* <- New error */
[LOG_DEBUG] = "debug", /* <- New error */
NULL
};
当我尝试上面的代码时,我得到以下错误
option_parser.cpp: In function 'int parse_log_level(char*)':
option_parser.cpp:30: error: expected primary-expression before '[' token
option_parser.cpp:31: error: expected primary-expression before '[' token
option_parser.cpp:32: error: expected primary-expression before '[' token
option_parser.cpp:33: error: expected primary-expression before '[' token
我选择了我的格式而不是教程的格式,因为它避免了错误并且我不理解语法,即我不理解 char *const 数组声明中的 [FOO] = "bar" 语法。我还注意到,在示例中,他们的枚举没有被命名,而我的等价物 LOG_LEVELS 是。我的枚举在我的程序的其他地方工作。最后,我注意到他们的枚举对第一项有类似的语法,即RO_OPT = 0, 在enum {RO_OPT = 0, RW_OPT, NAME_OPT}; 的上下文中。
我曾尝试在网上其他地方寻找类似的构造,但没有找到任何可以帮助我解决这个问题的东西。我希望我在尝试尽可能清楚地提出问题时不要过于冗长。
【问题讨论】:
标签: arrays pointers enums char constants