본문으로 바로가기

특정 이름공간(namespace)에 속하는 커맨드를 만드는 방법은 매우 간단합니다. Tcl_CreateCommand 나 Tcl_CreateObjCommand로 추가하고 싶은 커맨드의 이름 앞에 "::이름공간::이름공간..."라고 붙이면 됩니다.

DLLEXPORT int Abc_Init(Tcl_Interp* interp){
        if(Tcl_CreateObjCommand(interp, "::samplens::sample",
                sampleObjCmd, NULL, NULL) == TCL_ERROR) return TCL_ERROR;
        return TCL_OK;
}

이것만으로는 다른 이름공간에서 커맨드를 바로 사용 할수 없기 때문에, 커맨드를 호출 시에 항상 이름공간을 커맨드 앞에 붙여야 합니다. 그렇다면 namespace export를 하는 Tcl API 가 있지 않을까 하는 생각에 찾아보니 Tcl_Export라고 하는 API를 찾을 수 있었습니다. 하지만, 정식 API에는 공개되어 있지 않은 것 같아 사용은 하지 않고 다른 방법을 모색해 봤습니다. 위와 같은 API를 통한 방법 말고도 다른 방법이 있는데, 바로 Tcl의 스크립트를 Tcl_Eval로 사용하여, export 시키는 기능을 구현하는 것입니다.

DLLEXPORT int Abc_Init(Tcl_Interp* interp){
        if(Tcl_CreateObjCommand(interp, "::samplens::sample",
                sampleObjCmd, NULL, NULL) == TCL_ERROR) return TCL_ERROR;
        char cmd[] = "namespace eval samplens { namespace export * }";
        if(Tcl_Eval(interp, cmd) == TCL_ERROR) return TCL_ERROR;
        return TCL_OK;
}

회피하는 방법 같긴 하지만, 결과는 같습니다.