代码之家  ›  专栏  ›  技术社区  ›  Brendan Long

可以用变量体定义类似宏的函数吗?

  •  8
  • Brendan Long  · 技术社区  · 14 年前

    我一直在看 GCC docs 对于定义宏,它看起来是不可能的,但我想如果是的话,这里的人会知道的。

    我要做的是定义这个宏:

    synchronized(x) {
      do_thing();
    }
    

    扩展到:

    {
        pthread_mutex_lock(&x);
        do_thing();
        pthread_mutex_unlock(&x);
    }
    

    在C++中,我可以做一个 SynchronizedBlock 对象获取其构造函数中的锁并在析构函数中解锁,但我不知道如何在C中进行。

    我知道我可以在表单中使用函数指针 synchronized(x, &myfunction); 但是我的目标是让一些C代码看起来像Java一样多。是的,我知道这是邪恶的。

    4 回复  |  直到 14 年前
        1
  •  16
  •   Joe D    14 年前

    #define synchronized(lock) \
    for (pthread_mutex_t * i_#lock = &lock; i_#lock; \
         i_#lock = NULL, pthread_mutex_unlock(i_#lock)) \
        for (pthread_mutex_lock(i_#lock); i_#lock; i_#lock = NULL)
    

    synchronized(x) {
        do_thing(x);
    }
    

    synchronized(x)
        do_thing();
    
        2
  •  4
  •   Jonathan    14 年前

    #define synchronized(lock, func, args...) do { \
        pthread_mutex_lock(&(lock)); \
        func(##args); \
        pthread_mutex_unlock(&(lock)); \
    } while (0)
    

    synchronized(x, do_thing, arg1, arg2);
    
        3
  •  2
  •   salezica    14 年前

    for

    #define CONCAT(X, Y) X##__##Y
    #define CONCATWRAP(X, Y) CONCAT(X, Y)
    #define UNIQUE_COUNTER(prefix) CONCATWRAP(prefix, __COUNTER__)
    
    #define DO_MUTEX(m, counter) char counter; \
    for (counter = 1, lock(m); counter == 1; --counter, unlock(m))
    
    #define mutex(m) DO_MUTEX(m, UNIQUE_COUNTER(m))
    

    mutex(my_mutex) {
        foo();
    }
    

    char my_mutex__0;
    for (my_mutex__0 = 1, lock(my_mutex); my_mutex__0 == 1; --my_mutex__0, unlock(m)) {
        foo();
    }
    

        4
  •  1
  •   nategoose    14 年前

    #define synchronized(x, things) \
          do { \
               pthread_mutex_t * _lp = &(x); \
               pthread_mutex_lock(_lp);      \
               (things);                     \
               pthread_mutex_unlock(_lp);    \
          } while (0)
    
    ...
    
            synchronized(x,(
                              printf("hey buddy\n"),
                              a += b,
                              printf("bye buddy\n")
                            ));