什么是Tcl_cmdDeleteProc的正确写法?

时间:2015-12-08 11:50:30

标签: c++ tcl

提前告诉every1和thx。

我正在学习如何使用C ++扩展TCL,当我使用tcl.h库创建新命令时,我发现了以下示例,它实现了两个新命令“Hola”和“Media”。第一个只是在屏幕上打印Hola Mundo(西班牙语为Hello Word),第二个计算一组数字的平均值:

#include <stdio.h> 
#include <tcl.h> 
#include <tk.h>

/* Functions prototypes: */

int Tcl_AppInit(Tcl_Interp *interprete);

int hola (ClientData clientdata,Tcl_Interp *interprete,int argc,char *argv[]); 
int media (ClientData clientdata,Tcl_Interp *interprete,int argc,char *argv[]);


void main (int argc,char *argv[]) 
{ 
Tk_Main(argc,argv,Tcl_AppInit); 
} 

/* Tk_Main creates interprete before calling  Tcl_AppInit and then passing it as parameter */ 

int Tcl_AppInit(Tcl_Interp *interprete) 
{ 

/*Intialazing Tcl:*/ 

if(Tcl_Init(interprete)==TCL_ERROR) 
{ 
fprintf(stderr,"Error en la inicialización de Tcl.\n"); 
return TCL_ERROR; 
} 

/*Initialaizing Tk: */ 
if(Tk_Init(interprete)==TCL_ERROR) 
{ 
fprintf(stderr,"Error en la inicialización de Tk.\n"); 
return TCL_ERROR; 
}

/* New commands definitions: */ 
Tcl_CreateCommand(interprete,"hola",hola,(ClientData)NULL, 
(Tcl_CmdDeleteProc *)NULL); 
Tcl_CreateCommand(interprete,"media",media,(ClientData)NULL, 
(Tcl_CmdDeleteProc *)NULL); 

return TCL_OK; 
} 

/* command implementation */ 
int hola (ClientData clientdata,Tcl_Interp *interprete,int argc,char *argv[]) 
{ 
printf("\n\n¡Hola Mundo!!!\n\n"); 
return TCL_OK; 
} 
int media (ClientData clientdata,Tcl_Interp *interprete,int argc,char *argv[]) 
{ 
int elementos; 
double numero; 
double suma; 
int i; 
char **valores; 
char resultado[20];

/* Take data list in argv[1] and use single components: */ 
Tcl_SplitList(interprete,argv[1],&elementos,&valores); 
for(suma=0,i=0;i<elementos;i++) 
{ 
if(Tcl_GetDouble(interprete,valores[i],&numero)==TCL_ERROR) 
{ 
Tcl_SetResult(interprete,"Error en los parámetros",TCL_STATIC); 
return TCL_ERROR; 
} 
suma+=numero; 
} 
sprintf(resultado,"%f",suma/elementos); 
Tcl_SetResult(interprete,resultado,TCL_VOLATILE); 
return TCL_OK; 
}

这个例子对我和Borland程序员来说似乎很老(因为Void Main)。当我尝试编译时,我在新的命令定义上遇到了两个错误。

  /* New commands definitions: */ 
Tcl_CreateCommand(interprete,"hola",hola,(ClientData)NULL, 
(Tcl_CmdDeleteProc *)NULL); 
Tcl_CreateCommand(interprete,"media",media,(ClientData)NULL, 
(Tcl_CmdDeleteProc *)NULL); 

我在

上遇到错误
(ClientData)NULL

(Tcl_CmdDeleteProc *)NULL

阅读完Tcl手册后,我设法改变了:

(ClientData)NULL to ClientData(NULL)

它解决了第一个错误,但第二个错误仍在给出错误。

错误:

对于

(Tcl_CmdDeleteProc *)NULL --> not valid type conversion -fpermissive

对于

Tcl_CmdDeleteProc *(NULL) --> needed primary expresion before token

仅输入NULL

NULL --> not valid type conversion

我的问题是:我写错了吗?我必须定义Tcl_CmdDeleteProc的类型吗?

我正在编译没有标志,只是“g ++ -Wall name.cc -o name.o”

Vielen dank!

1 个答案:

答案 0 :(得分:1)

首先,Tcl_CmdDeleteProc是函数类型的typedef。关于你可以用它们做什么,函数类型有一些限制性的规则。

代码:

Tcl_CmdDeleteProc *(NULL)

完全错误,因为它只是一个解析错误。代码:

(Tcl_CmdDeleteProc *)NULL

是正确的,但它是C风格的explicit cast,并且您的编译器会设置为抱怨未设置-fpermissive标志的那些。对于C ++,您可能需要static cast

static_cast<Tcl_CmdDeleteProc *>(nullptr)

(如果您使用较旧的C ++,请使用NULL代替nullptr。)