Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
libxml2错误处理 我在C++中写了一个关于LIbxML2的小包装,我正在努力解决错误。现在,假设我只想把它们打印出来。以下是我目前掌握的情况:_C++_C_Libxml2 - Fatal编程技术网

libxml2错误处理 我在C++中写了一个关于LIbxML2的小包装,我正在努力解决错误。现在,假设我只想把它们打印出来。以下是我目前掌握的情况:

libxml2错误处理 我在C++中写了一个关于LIbxML2的小包装,我正在努力解决错误。现在,假设我只想把它们打印出来。以下是我目前掌握的情况:,c++,c,libxml2,C++,C,Libxml2,我的错误处理功能: void foo(void *ctx, const char *msg, ...) { cout << msg << endl; return; } #define TMP_BUF_SIZE 256 void err(void *ctx, const char *msg, ...) { char string[TMP_BUF_SIZE]; va_list arg_ptr; va_start(arg_ptr, msg);

我的错误处理功能:

void foo(void *ctx, const char *msg, ...) {
  cout << msg << endl;
  return;
}
#define TMP_BUF_SIZE 256
void err(void *ctx, const char *msg, ...) {
   char string[TMP_BUF_SIZE];
   va_list arg_ptr;
   va_start(arg_ptr, msg);
   vsnprintf(string, TMP_BUF_SIZE, msg, arg_ptr);
   va_end(arg_ptr);
   cout << string << endl;
   return;
}
但是,如果我解析了一个错误的XPath,我会得到以下输出:

%

如果没有错误处理代码,我会得到以下结果:

XPath error : Invalid expression //.@foobar ^
显然,最终我的错误处理将不仅仅是打印错误消息,它将把它记录到数据库或其他地方,但现在-我如何获得错误字符串?

函数foo的参数列表末尾的三个点意味着它需要可变数量的参数。要能够打印这些内容,您可以执行以下未经测试的操作:

#include <stdarg.h>

#define TMP_BUF_SIZE 256
void foo(void *ctx, const char *msg, ...) {
   char string[TMP_BUF_SIZE];
   va_list arg_ptr;

   va_start(arg_ptr, msg);
   vsnprintf(string, TMP_BUF_SIZE, msg, arg_ptr);
   va_end(arg_ptr);
   cout << string << endl;
   return;
}

函数foo的参数列表末尾的三个点表示它接受的参数数量可变。要能够打印这些内容,您可以执行以下未经测试的操作:

#include <stdarg.h>

#define TMP_BUF_SIZE 256
void foo(void *ctx, const char *msg, ...) {
   char string[TMP_BUF_SIZE];
   va_list arg_ptr;

   va_start(arg_ptr, msg);
   vsnprintf(string, TMP_BUF_SIZE, msg, arg_ptr);
   va_end(arg_ptr);
   cout << string << endl;
   return;
}

如前所述,如果这是您的处理功能:

void foo(void *ctx, const char *msg, ...) {
  cout << msg << endl;
  return;
}
#define TMP_BUF_SIZE 256
void err(void *ctx, const char *msg, ...) {
   char string[TMP_BUF_SIZE];
   va_list arg_ptr;
   va_start(arg_ptr, msg);
   vsnprintf(string, TMP_BUF_SIZE, msg, arg_ptr);
   va_end(arg_ptr);
   cout << string << endl;
   return;
}
如果您要传递一个上下文,即某个结构、数据、类或任何投射到void*的指针,您可以将其作为第一个参数


请注意,如果每次libxml在错误消息中添加一行时都出现解析错误,那么foo将被多次调用。

如前所述,如果这是您的处理函数:

void foo(void *ctx, const char *msg, ...) {
  cout << msg << endl;
  return;
}
#define TMP_BUF_SIZE 256
void err(void *ctx, const char *msg, ...) {
   char string[TMP_BUF_SIZE];
   va_list arg_ptr;
   va_start(arg_ptr, msg);
   vsnprintf(string, TMP_BUF_SIZE, msg, arg_ptr);
   va_end(arg_ptr);
   cout << string << endl;
   return;
}
如果您要传递一个上下文,即某个结构、数据、类或任何投射到void*的指针,您可以将其作为第一个参数


请注意,如果每次libxml在错误消息中添加一行时都有一个解析错误,则会多次调用foo。

这就差不多了-它会使我得到无效的表达式,但不会得到其余的表达式。这可能是消息包含的全部内容,您说仅打印msg时得到了%s,这表明foo只剩下一个参数,那就是要打印的字符串。也许这里的信息可以帮助你@木偶-这是有道理的。遗憾的是,关于传递给XMLGenericeErrorFunc的内容,文档并不是很详尽。不过你所拥有的对我来说已经足够好了。谢谢这就差不多了-它让我得到了无效的表达式,但不是其余的。这可能就是消息所包含的全部内容,您说您在只打印msg时得到了%s,这表明只有一个参数给了foo,这是一个要打印的字符串。也许这里的信息可以帮助你@木偶-这是有道理的。遗憾的是,关于传递给XMLGenericeErrorFunc的内容,文档并不是很详尽。不过你所拥有的对我来说已经足够好了。谢谢