ロックに失敗した場合に備えて、以下のマクロを作成してミューテックスをロックし、(このマクロが呼び出される関数から)返すようにしました。現在、私は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と同様に使用できます。
returnを含む関数型マクロ...これは本当に厄介です。それを忘れて、適切なロック機能を使って 'if(!my_lock())return;'を呼び出しサイトで使用してください。 – Mat
[variadic macros](https://en.wikipedia.org/wiki/Variadic_macro)がありますが、警告があります。そして、あなたのコードの他の読者(そして1年程度であなたを含む他の人たち)には本当に混乱します。 –
@JoachimPileborg呼び出しが混乱するか、マクロ定義のみが必要ですか?後者のみの場合、賢明なコメントがあればそれを解決すべきでしょうか? –