Я выбираю «С - ничего из вышеперечисленного».
Хотя это не прямой ответ на вопрос, который вы на самом деле задали, правильное решение ситуации кажется мне довольно простым и очевидным: вам не следует использовать ничего из перечисленного.
По крайней мере, IMO, у вас есть действительно веская причина поступить иначе, ваша функция должна принять void *
или (предпочтительно) void const *
. То, что вы ищете, в основном непрозрачный указатель, и это именно то, что обеспечивает void *
. Пользователю не нужно ничего знать о внутренностях вашей реализации, и, поскольку любой другой тип указателя преобразуется в void *
неявно, это одна из немногих возможностей, которая также не нарушает существующий код.