gpt4 book ai didi

c++ - Tcl_cmdDeleteProc 的正确写法是什么?

转载 作者:行者123 更新时间:2023-11-30 05:34:37 26 4
gpt4 key购买 nike

我正在学习如何使用 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”

最佳答案

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

代码:

Tcl_CmdDeleteProc *(NULL)

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

(Tcl_CmdDeleteProc *)NULL

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

static_cast<Tcl_CmdDeleteProc *>(nullptr)

(如果您使用的是较旧的 C++,请使用 NULL 而不是 nullptr。)

关于c++ - Tcl_cmdDeleteProc 的正确写法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34155160/

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