Создать макрос в C, который отслеживает текущую область - PullRequest
0 голосов
/ 12 октября 2019

В 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, который занимает одну строку и будет также отслеживать выходобласти?

1 Ответ

1 голос
/ 12 октября 2019

То, что вы просите, невозможно в стандартном C;но в зависимости от вашего компилятора может быть атрибут для него. В GCC атрибут очистки может, вероятно, делать то, что вы хотите

#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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...