提前告诉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!
答案 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
。)