有没有办法提供单个宏函数来返回不同类型的值,包括什么?

时间:2016-01-01 10:58:36

标签: c c-preprocessor

我已经创建了以下宏来锁定互斥锁并返回(从调用此宏的函数),以防尝试锁定失败。目前我已将其缩小为2个宏 - 一个用于从返回值的函数返回,不论类型如何,另一个用于从没有返回任何函数的函数返回(即 void )。

宏之外的代码(下面)仅供参考,与使用宏的实际生产代码几乎没有关系。

#define MUTEX_LOCK()\
    {\
        if (pthread_mutex_lock(&mutex) != 0)\
        {\
            printf("Failed to lock mutex.\n");\
            return;\
        }\
    }
#define MUTEX_LOCK_RVAL(err_val)\
    {\
        if (pthread_mutex_lock(&mutex) != 0)\
        {\
            printf("Failed to lock mutex.\n");\
            return err_val;\
        }\
    }

void vfunc()
{
    printf("\nIn vfunc()\n");
    MUTEX_LOCK();
    printf("\nOut of vfunc()\n");
}

UINT16 uint16func()
{
    printf("\nIn uint16func()\n");
    MUTEX_LOCK_RVAL(0);
    printf("\nOut of uint16func()\n");

    return 9;
}

CHAR* errstr = "Hoo boy!";
CHAR* strfunc()
{
    printf("\nIn strfunc()\n");
    MUTEX_LOCK_RVAL(errstr);
    printf("\nOut of strfunc()\n");

    return NULL;
}

有没有办法将这些减少到可以在返回值的函数中使用的单个宏以及 void

3 个答案:

答案 0 :(得分:4)

为了使它与ANSI兼容,我使用return和另一个计算为null的简单符号定义宏,并清楚地显示它为null。 即:

#define VOID_RET    //This nulls the return value
#define MUTEX_LOCK(err_val)\
    {\
        if (pthread_mutex_lock(&mutex) != 0)\
        {\
            printf("Failed to lock mutex.\n");\
            return err_val;\
        }\
    }
void *mutex = NULL;
void vfunc(void)
{
    printf("\nIn vfunc()\n");
    MUTEX_LOCK(VOID_RET);
    printf("\nOut of vfunc()\n");
}
UINT16 uint16func(void)
{
    printf("\nIn uint16func()\n");
    MUTEX_LOCK(0);
    printf("\nOut of uint16func()\n");

    return 9;
}
CHAR* errstr = "Hoo boy!";
CHAR* strfunc(void)
{
    printf("\nIn strfunc()\n");
    MUTEX_LOCK(errstr);
    printf("\nOut of strfunc()\n");

    return NULL;
}

我在C11和C99下测试了这段代码。

答案 1 :(得分:2)

据我从文档中可以看出,您可以删除不带参数的宏函数,因为您没有义务将参数传递给期望参数的宏函数。
来自{{3} }:

  

你可以将宏参数留空;这不是一个错误   预处理器[...]

对于多个参数,这很有趣:

  

你不能完全抛弃争论;如果一个宏需要两个   参数,它的顶层必须只有一个逗号   参数列表。

给出这些例子:

min(, b)        ==> ((   ) < (b) ? (   ) : (b))
min(a, )        ==> ((a  ) < ( ) ? (a  ) : ( ))
min(,)          ==> ((   ) < ( ) ? (   ) : ( ))
min((,),)       ==> (((,)) < ( ) ? ((,)) : ( ))

答案 2 :(得分:2)

我能想象的唯一解决方案是:

#define MUTEX_LOCK( err_val )\
{\
  {\
      if (pthread_mutex_lock(&mutex) != 0)\
      {\
          printf("Failed to lock mutex.\n");\
          return err_val;\
      }\
   }\
}

int test_int()
{
    MUTEX_LOCK( 1 );

    return 0;
}

void test_void()
{
    MUTEX_LOCK( ; );

    return;
}