我已经创建了以下宏来锁定互斥锁并返回(从调用此宏的函数),以防尝试锁定失败。目前我已将其缩小为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 。
答案 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;
}