在 C 中创建跟踪当前范围的宏

标签 c macros

在 C++ 中,对象构造函数和析构函数可用于在代码执行期间跟踪作用域,如下所示:

#define TRACE(msg) Helper trace_helper(msg);
class Helper {
    const char* _name;
    Helper(const car* name) {
        _name = name;
        printf(“enter %s”, name);
    }
    ~Helper() { printf(“exit %s”, _name); }
};

这允许我跟踪我的代码,例如

main() {
TRACE(“main”)
    for(...) {
         foo();
     }
}

void foo() {
    TRACE(“foo”)
     do some stuff
     if(condition) {
         TRACE(“inner block”)
          do some stuff
     }
}

例如,这对于分析代码很有用。

现在,C 中没有可用的构造函数和析构函数,我想知道是否仍然可以创建一个 TRACE 宏,它只需要一行,并且还可以跟踪作用域的退出?

最佳答案

你所要求的在标准C中是不可能的;但根据您的编译器,可能有一个属性。在 GCC 中,cleanup 属性可能可以做你想要的事情

#include <stdio.h>
void tracemsg(void* ctx){
    printf("scope exit\n");
}
#define SCOPE_CHECK \
    void* ctx __attribute__((cleanup (tracemsg)));

int main(){
    {
        SCOPE_CHECK;//gets printed last
        printf("in scope\n");
        printf("in scope\n");
        printf("in scope\n");
        printf("in scope\n");
    }
}

关于在 C 中创建跟踪当前范围的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58353253/

相关文章:

c - 更新 C 中的文本文件(可能吗?)

c - 动态数组分配和复制到更大的

C程序输出令人困惑

c - 从 net-snmp C 包运行 snmpget 时出错

c - getc() "stores"输入并与 scanf() 重用,不允许用户输入

c - 在 c 宏方面需要帮助

macros - 这个 Rust 宏有什么问题?

c - Peterson 算法的错误实现?

c - 在宏函数中使用数值常量

eclipse-plugin - 无法在 Eclipse 上安装实际宏