Я бы хотел защитить эту функцию от многократного случайного вызова
Для меня это звучит как проблема, которая возникает только во время отладки. Если это так, я бы просто сделал следующее:
void InitFoo()
{
#ifndef NDEBUG
static bool onlyCalledOnce = TRUE;
assert(onlyCalledOnce);
onlyCalledOnce = FALSE;
#endif
...
}
Цель этой конкретной бородавки легко понять, просто взглянув на нее, и она вызовет приятную, большую, броскую ошибку утверждения, если программист когда-либо совершит ошибку, вызывая InitFoo
более одного раза. Это также полностью исчезнет в производственном коде. (когда определено NDEBUG
).
edit : краткая заметка о мотивации:
Вызов функции init более одного раза, вероятно, является большой ошибкой. Если конечный пользователь этой функции дважды вызвал ее по ошибке, то игнорирование этой ошибки, вероятно, не тот путь. Если вы не пойдете по маршруту assert()
, я бы по крайней мере рекомендовал вывести сообщение на stdout
или stderr
.