Сравните сигнатуру обернутых функций

#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");