我试图评估萨克森-C1.2.1,他在CentOS8和安装似乎已经顺利。不过,通过cd samples/cppTests && build64-linux.sh尝试这些示例会导致大量编译错误,如下所示:
../../Saxon.C.API/SaxonProcessor.h:599:32:错误:除法‘sizeof of (JNINativeMethod*) /sizeof(JNINativeMethod)’不计算数组元素的数量-Werror=sizeof of-指针-div gMethods,sizeof of(GMethods)/gMethods);
在我简要地、可信地关闭-Werror=sizeof-指针-div之前,我检查了源代码,那里发生了什么看起来很可疑。
bool registerCPPFunction(char * libName, JNINativeMethod * gMethods=NULL){
if(libName != NULL) {
setConfigurationProperty("extc", libName);
}
if(gMethods == NULL && nativeMethodVect.size()==0) {
return false;
} else {
if(gMethods == NULL) {
//copy vector to gMethods
gMethods = new JNINativeMethod[nativeMethodVect.size()];
}
return registerNativeMethods(sxn_environ->env, "com/saxonica/functions/>
gMethods, sizeof(gMethods) / sizeof(gMethods[0]));
}
return false;
}更具体地说,sizeof(gMethods) / sizeof(gMethods[0])似乎不会按任何幅度计算任何有用的东西。这样做的目的可能是输出一些与nativeMethodVect.size()值相同的代码,但我可能第一次看到了这个项目的源代码,我可能是误解了,实际上,这个划分是有意的吗?
在下面的例子中,我倾向于猜测意图实际上更接近b而不是a:
#include <cstdio>
struct test
{
int x, y, z;
};
int main()
{
test *a = new test[32], b[32];
printf("%d %d\n", sizeof(a)/sizeof(a[0]), sizeof(b)/sizeof(b[0]));
return 0;
}它的输出为032,它被期望为(A)的大小,给出指针的大小,而不是数组的内存区域的大小。
发布于 2020-03-10 11:53:31
这段代码是为了支持XSLT样式表和XQuery查询中用户定义的扩展函数的特性。如果用户没有使用这些特性,那么他们就不需要这些代码了。实际上,用户定义的扩展函数仅在Saxon/C和Saxon/C中可用,因此不应该在Saxon/C代码库中。我创建了下面的bug问题来调查上面的错误和https://saxonica.plan.io/issues/4477的错误
我认为解决办法是,如果没有使用扩展函数特性,则要么删除有关代码,要么删除编译标志-Werror=sizeof-指针-div。
当时的意图如下:
jobject JNICALL cppNativeCall(jstring funcName, jobjectArray arguments, jobjectArray argTypes){
//native call code here
}
JNINativeMethod cppMethods[] =
{
{
fname,
funcParameters,
(void *)&cppNativeCall
}
};
bool nativeFound = processor->registerNativeMethods(env, "NativeCall",
cppMethods, sizeof(cppMethods) / sizeof(cppMethods[0]));https://stackoverflow.com/questions/60613404
复制相似问题