Номер строки звонящего не особенно легко получить (это не информация, которую Tcl действительно много раскрывает), но вы можете попробовать (предполагая, что Tcl достаточно недавно; без info frame
вы застряли):
int line = -1; // A dummy value
if (Tcl_Eval(interp, "dict get [info frame -1] line") == TCL_OK)
// The nullptr below because we're ignoring errors
(void) Tcl_GetIntFromObj(nullptr, Tcl_GetObjResult(interp), &line);
// if line is at least 1, you've got a valid line number.
Возможно, вам потребуется изменить значение, переданное на info frame
(-1 означает «вызывающий», но я не уверен, как с этим взаимодействует вызов через уровень C / C ++).
Обратите внимание, что вы также можете выполнять извлечение словаря в коде C; это может означать, что вы можете подобрать другие полезные отображения, такие как file
и, возможно, proc
. Они там не гарантированы (ключ proc
присутствует только для процедур, а условия, когда присутствует ключ file
, очень сложно охарактеризовать, за исключением того, что он почти всегда присутствует для исходного кода), но они очень помогают при отладке.
Обратите внимание, что информация, сообщаемая info frame
, не экспортируется через какой-либо публичный c C API Tcl. Вам действительно нужно запустить (крошечный) скрипт, чтобы получить его.
Имейте в виду, что он считается ЧРЕЗВЫЧАЙНО ПЛОХОЙ СТИЛЬ , чтобы ваш код изменился значительно в поведении в зависимости от того, откуда он вызывается или как он называется. Это также может сделать ваш код чрезвычайно сложным для отладки и тестирования. Имейте большую заботу!