【发布时间】:2016-01-01 10:58:35
【问题描述】:
我创建了以下宏来锁定互斥体并返回(从调用此宏的函数中)以防锁定尝试失败。目前我已将其缩小到 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 中使用。
【问题讨论】:
-
包含返回的类似函数的宏......这真的很讨厌。算了,在调用点使用
if (!my_lock()) return <whatever>;,有适当的锁定功能。 -
可能使用例如variadic macros,但有一些警告。这真的会让你的代码的其他读者感到困惑(而“其他人”我会在一年左右的时间里将你包括在内)。
-
@JoachimPileborg 你认为调用会令人困惑,还是只有宏定义?如果只有后者,一些明智的 cmet 应该解决它,不是吗?
-
哦,当您将
pthread_mutex_lock的返回值与未初始化的局部变量 进行比较时,您当前的宏包含未定义的行为。实际上你根本不需要变量,我真的建议你考虑一下@Mat 在说什么,然后你可以有一个简单的宏。 -
你把打印放在了锁功能里,不用重复了。隐藏 return 语句不是如果唯一可以为您节省几次击键的事情。记住你写了一次代码,但读了很多次。如果这意味着您的函数的控制流已变得不可见,则保存几个字符是个坏主意。
标签: c c-preprocessor