Tcl_CreateCommand的类型转换无效

Tcl_CreateCommand invalid type conversion

本文关键字:类型转换 无效 CreateCommand Tcl      更新时间:2023-10-16

我正在使用TCL.h创建一个新的TCL命令,代码如下:

#include <tcl.h>
#include <iostream>

using namespace std;

int saludo (ClientData clientData,Tcl_Interp *interp, int argc,char *argv[])
            {cout << "Hello World";}

int main(int argc, char *argv[]) {

    Tcl_Interp *interp;
    interp = Tcl_CreateInterp();

    Tcl_CreateCommand(interp, "sal", saludo, ClientData(NULL), (Tcl_CmdDeleteProc *)NULL);

}

但我得到错误>

[arch@myLinux tcl_interpreter]$ make
g++    -c -o interpreter.o interpreter.cc
interpreter.cc: In Funktion »int main(int, char**)«:
interpreter.cc:24:87: Fehler: ungültige Umwandlung von »const char     (*)(ClientData, Tcl_Interp*, int, char**) {aka const char (*)(void*,     Tcl_Interp*, int, char**)}« in »int (*)(ClientData, Tcl_Interp*, int, const     char**) {aka int (*)(void*, Tcl_Interp*, int, const char**)}« [-fpermissive]
   Tcl_CreateCommand(interp, "sal", saludo, ClientData(NULL),     (Tcl_CmdDeleteProc *)NULL);

我已经知道这是c代码,我在命令行>中使用-fpermission

CC=gcc
CFLAGS=-c -Wall -fpermissive 

但它似乎不起作用。我使用的是gcc 5.2。

有什么想法,谢谢!

问题在于声明:

int saludo (ClientData clientData,Tcl_Interp *interp, int argc,char *argv[])

这不是const的正确版本。您需要使用:

int saludo (ClientData clientData,Tcl_Interp *interp, int argc,const char *argv[])

这是因为将被传递到代码中的字符串不能被函数修改(因为代码的其他部分会观察到这些字符串,并认为它们不会被修改)。请注意,Tcl的旧版本可能不需要const正确,但这是API描述的错误(多年前);自从8.0以后,字符串就再也不允许修改了。