#gcc #c99
Вопрос:
gcc поддерживает функции обертывания, так что функция-оболочка вызывается вместо реальной функции. Эта замена происходит на уровне компоновщика.
/* myfile.c */
int myF(int x);
int __wrap_myF(int x)
{
return x 1;
}
int main(int argc, char ** argv)
{
return myF(5);
}
Когда я скомпилирую это с
gcc -Wl,--wrap=myF myfile.c -o myfile.exe
и выполните двоичный файл, я получу возвращаемое значение 5.
Когда я теперь изменяю подпись __wrap_myF()
, это не распознается компилятором/компоновщиком. Я ожидал бы ошибки или, по крайней мере, предупреждения, если я изменю подпись следующим образом:
int myF(int x);
int __wrap_myF(int x, int y) /* <-- added a second parameter */
{
return x 1;
}
int main(int argc, char ** argv)
{
return myF(5);
}
Есть ли способ, которым gcc автоматически выдает ошибку, если подпись функций переноса не эквивалентна завернутой?
Существует ли какое-либо расширение gcc, которое позволяет сравнивать сигнатуры двух функций?
_Static_assert(__builtin_signature(myF) == __builtin_signature(__wrap_myF), "failure")
Если бы существовал стандартный способ C, я был бы признателен за это, но я сильно в этом сомневаюсь.
Заранее спасибо.
Ответ №1:
Если бы существовал стандартный способ C
Такого способа не существует.
Существует ли какое-либо расширение gcc, которое позволяет сравнивать сигнатуры двух функций?
_Static_assert(
__builtin_types_compatible_p(
__typeof__(amp;myF), __typeof__(amp;__wrap_myF)
), "failure");