gpt4 book ai didi

php - 强制类型 SWIG

转载 作者:可可西里 更新时间:2023-11-01 18:37:00 32 4
gpt4 key购买 nike

所以我有以下C++

#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;

int hello(char *str);

int hello(char *str) {
cout << "Hello World: " << str << endl;
return 0;
}

还有下面的swig界面

%module sphp

%{
extern int hello(char *str);
%}

extern int hello(char *str);

我可以在 php 中编译和使用它,

php> hello("testing!");

这一切都是邪恶的!

唯一的问题是

php> hello(3);

仍然有效。我不想要这个,它似乎 swig 默默地转换类型

  /*@SWIG:/usr/share/swig2.0/php/utils.i,62,CONVERT_STRING_IN@*/
if ((*args[0])->type==IS_NULL) {
arg1 = (char *) 0;
} else {
convert_to_string_ex(args[0]);
arg1 = (char *) Z_STRVAL_PP(args[0]);
}
/*@SWIG@*/;

现在我不想编辑包装器,因为它是自动生成的。有没有一种方法可以关闭这种静默转换,这样 hello(3) 就会抛出异常或错误,或者我可以给 hello 一个关于类型的提示吗? php参数原来是传过来的?

最佳答案

遗憾的是,由于包装器的生成方式,您无法完全摆脱强制转换。但是,您可以拦截基本数据类型并将它们重定向到模板函数,如下所示:

%module sphp

%{
#include <iostream>

extern int hello(char *str);

template<class T>
int hello(const T &)
{
std::cout << "unsupported data type" << std::endl;
}
%}

extern int hello(char *str);

template<class T>
int hello(const T &);

%template(hello) hello<int>;

要拦截更多数据类型,只需添加一个新的运算符重载:

%template(hello) hello<double>;

更新:

这是一个更困难的方法,它通过覆盖 SWIG 的 typemaps 来工作。 .这取自 SWIG 的 PHP 类型映射并进行了修改以防止它转换值。

%module sphp

%{
extern int hello(char *str);
%}

%typemap(in) char *
{
if ((*$input)->type != IS_STRING)
SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected string");
$1 = ($1_ltype) Z_STRVAL_PP($input);
}

%typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) {
if ((*$input)->type != IS_STRING)
SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected string");
$1 = ($1_ltype) Z_STRVAL_PP($input);
$2 = ($2_ltype) Z_STRLEN_PP($input);
}

extern int hello(char *str);

输出:

php > include ("sphp.php");
php > hello("test");
Hello World: test
php > hello(3);
PHP Fatal error: Type error in argument 1 of hello. Expected string in php shell code on line 1
php > hello([]);
PHP Fatal error: Type error in argument 1 of hello. Expected string in php shell code on line 1
php >

这更乏味,因为如果您想完全摆脱自动参数转换,您必须以相同的方式覆盖每个类型,另一方面,它可以让您更好地控制参数转发的行为。

关于php - 强制类型 SWIG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20843134/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com