Двоичная совместимость при изменении имени параметра в переполнении стека

У меня есть вопрос об изменении имени параметра функции-члена.

У меня есть функция foo(type iA) тогда я перехожу на foo(type iB)Я думаю, что это бен комп, но я не уверен.

Не могли бы вы помочь мне объяснить причину? Большое спасибо!

1

Решение

Конечно, это будет двоичный код, потому что вы не меняете тип объекта. Следовательно, размер остается прежним. Имя переменной только для человека.

На самом деле вы можете объявить функцию, не давая никаких имен, например:

int funct(void*, int, Object)

Когда вы определите это, вы можете использовать все, что вам нравится

int funct(void* ptr, int something , Object object){return 42;};

Это хорошо. Это также работает для учеников.

(Я бы сказал, главная) причина бинарной совместимости или несовместимости — размеры передаваемых объектов. Поэтому, когда вы работаете с реальными двоичными данными, на уровне ассемблера смещения не меняются. Если вы изменили типы, аргументы будут находиться в разных местах памяти, и смещения для них необходимо будет пересчитать. Важны адреса, а не псевдонимы или имена.

Редактирование:

Ради полноты.
Как указала @Lightness, вы также можете пропустить имена в определении, так что пример, который я привел, может выглядеть так: int funct(void*, int, Object){return 42;};,

Также относительно комментария @James. Я бы сказал, что когда два объекта имеют одинаковый размер, это становится мутным. Конечно, нет никакого смысла делать такое дикое преобразование из одного типа в другой. Однако, учитывая предыдущий пример, если вы не используете операнд, он, вероятно, будет работать … на уровне ассемблера. Если бы размеры отличались, это повредило бы стек.

Однако, когда я подумал, как прокомментировать эту проблему, я сказал себе, что вы спрашиваете о c++, Итак, давайте посмотрим на это с этой точки зрения. Я бы сказал, что функции двоично совместимы, когда их подпись не меняется. И имена операндов не являются частью этого в любом определении. Подпись функции является основой для искажения и перегрузки имени, а также имени символа в конечном двоичном объекте.

3

Другие решения

Имена аргументов как раз для вас, чтобы различать аргументы. Вы можете иметь разные имена в объявлении функции и определении функции.

Так что все в порядке:

void foo(int bar);  // Declare function

...

// Define function
void foo(int bibibibibi)
{
...
}

Объявление и определение выше для той же функции. C ++ не переопределяет и не перегружает функции на основе имен аргументов, только типы аргументов.

Компилятор не хранит имена аргументов (или других переменных), кроме как отладочная информация. Фактически сгенерированный код не имеет информации об именах переменных.

3

По вопросам рекламы [email protected]