Apache模块命令parsing器原型

我正在创build一个Apache2模块,遇到一个奇怪的编译问题。 这是我的函数的原型,用于parsing名为“ analytics_ip ”的configuration命令:

static const char *apr_cfg_set_analytics_ip(cmd_parms *cmd, void *config, const char *data); 

这是包含指向此函数的指针的command_rec结构的数组:

 static const command_rec apr_cmds[] = { AP_INIT_TAKE1("analytics_ip", apr_cfg_set_analytics_ip, NULL, OR_ALL, ""), { NULL } }; 

结构command_rec在头文件http_config.h中声明

 typedef struct command_struct command_rec; struct command_struct { /** Name of this command */ const char *name; /** The function to be called when this directive is parsed */ cmd_func func; /** Extra data, for functions which implement multiple commands... */ void *cmd_data; /** What overrides need to be allowed to enable this command. */ int req_override; /** What the command expects as arguments */ enum cmd_how args_how; /** 'usage' message, in case of syntax errors */ const char *errmsg; }; 

当我按照cmd_func ,它得到以下声明:

 typedef const char *(*cmd_func) (); 

如果我没有弄错,这意味着“指向函数的指针返回指向字符的指针,不接受任何参数”。 这怎么可能? 命令parsing函数必须至less接受一个包含该函数对应的configurationvariables模块值的参数。

我正在使用g ++来编译这个模块。 错误信息:

 mod_xxx.h:65:2: error: invalid conversion from 'const char* (*)(cmd_parms*, void*, const char*) {aka const char* (*)(cmd_parms_struct*, void*, const char*)}' to 'cmd_func {aka const char* (*)()}' [-fpermissive] }; 

提前致谢

Solutions Collecting From Web of "Apache模块命令parsing器原型"

cmd_func是一个联合,它在http_config.h中定义如下:

 typedef union { /** function to call for a no-args */ const char *(*no_args) (cmd_parms *parms, void *mconfig); /** function to call for a raw-args */ const char *(*raw_args) (cmd_parms *parms, void *mconfig, const char *args); /** function to call for a argv/argc */ const char *(*take_argv) (cmd_parms *parms, void *mconfig, int argc, char *const argv[]); /** function to call for a take1 */ const char *(*take1) (cmd_parms *parms, void *mconfig, const char *w); /** function to call for a take2 */ const char *(*take2) (cmd_parms *parms, void *mconfig, const char *w, const char *w2); /** function to call for a take3 */ const char *(*take3) (cmd_parms *parms, void *mconfig, const char *w, const char *w2, const char *w3); /** function to call for a flag */ const char *(*flag) (cmd_parms *parms, void *mconfig, int on); } cmd_func; 

enum cmd_how args_how; 负责选择正确版本的功能。

处理它的交换机位于server / config.c中 (在invoke_cmd函数中)。

您似乎正在使用对应于cmd->AP_TAKE1的“take1”版本,或者只是使用cmd->take1

问题可能是C和C ++ 在联合初始化方面有差异 。 ( AP_INIT_TAKE1使用在{ .take1=func } C ++中不起作用的{ .take1=func }语法)。

你必须以C ++兼容的方式初始化static const command_rec apr_cmds ,或者把它移动到用C编译的单独的目标文件。或者如果你不使用C ++,那么只需用gcc编译。

对于我正在处理的项目,我们最终添加了一个强制转换以允许编译成功完成,并且代码似乎正常工作,因为它正确读取配置文件中指定的值。 下面是这个练习的摘录: extern "C" { static const command_rec kiwix_settings[] = { AP_INIT_TAKE1("zimFile", (const char* (*)())kiwix_set_zimfilename, NULL, RSRC_CONF, "The ZIM filename in full including the extension"), AP_INIT_TAKE1("zimPath", (const char* (*)())kiwix_set_path, NULL, RSRC_CONF, "The path to the ZIM file, including the trailing //"), { NULL } }; } extern "C" { static const command_rec kiwix_settings[] = { AP_INIT_TAKE1("zimFile", (const char* (*)())kiwix_set_zimfilename, NULL, RSRC_CONF, "The ZIM filename in full including the extension"), AP_INIT_TAKE1("zimPath", (const char* (*)())kiwix_set_path, NULL, RSRC_CONF, "The path to the ZIM file, including the trailing //"), { NULL } }; }

完整的文件(实际上是项目)是开源的。 这里是链接到完整的文件https://github.com/kiwix/kiwix-apache/blob/master/mod_kiwix.cpp

PS:感谢您的问题和https://stackoverflow.com/users/257568/artemgr的答案,因为他们帮助我和另一位志愿者解决如何解决我们项目的问题。