Ich kompiliere eine UDF auf IBM Netezza mit C++ wie in der Dokumentation here. Mein Code kompiliert ohne ProblemeC++ Regex-Header nicht für Netezza UDF
#include <stdarg.h>
#include <string.h>
#include <regex.h>
#include "udxinc.h"
#include "udxhelpers.h"
using namespace nz::udx_ver2;
class Dateconvert: public Udf
{
public:
Dateconvert(UdxInit *pInit) : Udf(pInit){}
~Dateconvert(){}
static Udf* instantiate(UdxInit *pInit);
virtual ReturnValue evaluate()
{
StringReturn* ret = stringReturnInfo();
StringArg *str;
str = stringArg(0);
int lengths = str->length;
char *datas = str->data;
char retval[100];
strcpy(retval,"99991231");
ret->size = sizeof(retval);
memcpy(ret->data, retval, sizeof(retval));
NZ_UDX_RETURN_STRING(ret);
}
};
Udf* Dateconvert::instantiate(UdxInit *pInit)
{
return new Dateconvert(pInit);
}
Ich brauche Regex zu verwenden, um das String-Argument mit einiger regulären Ausdruck Logik zu verarbeiten. Aber wenn ich versuche, in
#include <regex>
oder
#include <regex.h>
und der Code regex-spezifischen Code hinzuzufügen:
string int_num= "some pattern"
string test= "test"
regex pattern(int_num);
if(regex_match(test, pattern) { do something};
ich folgende Fehler:
/nz/kit.7.2.0.7-P1/sys/cc/bin/i686-rhel5-linux-gnu-g++ -o
/export/home/nz/DateConvert.o_x86 -fPIC -shared -Wa,--32 -march=prescott
-mfpmath=sse -D__STDC_CONSTANT_MACROS -DGENCODE -DNZDEBUG=0 -DNZ_UDX_COMPILE
-I/nz/kit.7.2.0.7-P1/sys/include -I/nz/kit.7.2.0.7-P1/sys/include/pg/include
-DLINUX /export/home/nz/DateConvert.cpp
/export/home/nz/DateConvert.cpp:3:17: error: regex: No such file or directory
/export/home/nz/DateConvert.cpp: In member function 'virtual nz::udx::ReturnValue Dateconvert::evaluate()':
/export/home/nz/DateConvert.cpp:27: error: 'regex' was not declared in this scope
/export/home/nz/DateConvert.cpp:27: error: expected `;' before 'pattern'
/export/home/nz/DateConvert.cpp:45: error: 'pattern' was not declared in this scope
/export/home/nz/DateConvert.cpp:45: error: 'regex_match' was not declared in this scope
Jedes Online-Beispiel verwendet diese beiden Heade rs für Regex in C++. Warum registriert es sich nicht beim Kompilieren?
Dies ist der Kompilierungsbefehl durch die Art und Weise:
nzudxcompile /export/home/nz/dateconvert.cpp -o dateconvert.o
--sig "Dateconvert(VARCHAR(200))" --version 2 --return "VARCHAR(200)"
--class Dateconvert --user user1 --pw pw1 --db db1
'using std :: regex;'. –
Bedeutet das, dass "std :: regex" an einen regulären Code angehängt wird oder "namespace std :: regex" an den Anfang des Codes gesetzt wird? @AlanStokes – Danzo
Sie können die Zeile hinzufügen, die ich am Anfang des Codes angegeben habe ('regex' ist ein Name, kein Namespace). Oder setzen Sie explizit 'std ::' vor 'regex'. –