#c #reference #bind #lvalue
#c #ссылка #привязка #значение lvalue
Вопрос:
Я думаю, что мне чего-то не хватает в моей теоретической подготовке по этому вопросу. Я знаю, что были похожие сообщения, но я все еще этого не понимаю.
У меня есть такой код:
void somefunc1(Word amp;Key)
{
somefunc2(Key);
}
void somefunc2(char amp;char1)
{
return;
}
компилятор выдает мне ошибку здесь:
somefunc2(Key);
[Ошибка BCC32] Unit1.cpp (830): Ссылка E2357, инициализированная ‘unsigned short’, требует значения lvalue типа ‘char’
Я выяснил, что это из-за правил ANSI 2003 о C , касающихся временных файлов и ссылок, но я все еще не понимаю, что здесь не так.
когда я выполняю преобразование в стиле c:
somefunc2( *(char*)amp;Key )
это устраняет проблему.
Кто-нибудь может подсказать мне, что не так и почему это неправильно?
Комментарии:
1. Пожалуйста, предоставьте полный код на c . предоставленный вами код должен был объявлять функцию, которую я использую, но пропускает возвращаемый тип. Я думаю, что полный, предназначенный для работы фрагмент C поможет вам намного лучше
2. Извините, это вечер пятницы. Я исправлю через секунду.
3. Что такое
Word
? Это целочисленный тип или объект?
Ответ №1:
WORD amp;Key;
Ссылка всегда является псевдонимом для некоторого другого объекта, и она должна быть инициализирована объектом, который уже существует. Таким образом, приведенное выше объявление недопустимо. Вместо этого правильно следующее:
WORD amp;Key = alreadyExistingKey;
[Вышесказанное больше не актуально, вопрос изменился.]
Редактировать:
void somefunc1(Word amp;Key)
{
somefunc2(Key);
}
void somefunc2(char amp;char1)
{
return;
}
[Ошибка BCC32] Unit1.cpp (830): Ссылка E2357, инициализированная ‘unsigned short’, требует значения lvalue типа ‘char’
Компилятор сообщает вам, что somefunc2
ожидает [ссылку, то есть псевдоним для] a char
. Но Key
in somefunc1
вместо этого является a Word
, который, как я понимаю, является typedef для unsigned short
.
Мне кажется, что ваше средство «в стиле c» жестоко переосмысливает amp;Key
, то есть адрес an unsigned short
, как адрес a char
. Следовательно, то, что вы передаете, somefunc2
является первым байтом Key
, интерпретируемым как a (подписанный) char
. Я предполагаю, что результат зависит от порядкового номера. Я бы не стал полагаться на этот код.
Комментарии:
1. Не могли бы вы, пожалуйста, также подсказать, что было бы неплохо сделать в этом случае? Это всего лишь две функции, которые я не могу изменить (у меня нет доступа к исходному коду), и такого рода неявное преобразование, я не большой поклонник, но с которым приходится иметь дело. reinterpret_cast, скорее всего, был бы таким же жестоким подходом здесь, я полагаю?
2. @Andrew: Если у вас нет доступа к исходному коду и функции не компилируются вместе, что именно у вас есть? Что является источником, который вы опубликовали, если не «эти функции»?
3. @Andrew: Чтобы рекомендовать, что вам следует делать, нам сначала нужно знать, как данные используются этими функциями. Предполагая стандартные размеры данных, у вас есть ссылка на 2 байта данных, которые вы пытаетесь передать в функцию, которая принимает ссылку только на 1 байт. Мы не знаем, какой байт следует передать. Кроме того, мы не знаем, изменяет ли somefunc2 указанный байт, и если это происходит, то мы не знаем, что должно произойти с другим байтом данных. Существуют различные способы написания somefunc1 в зависимости от того, какова его фактическая цель.
Ответ №2:
Временные файлы не могут быть привязаны к непостоянным ссылкам.
Вы должны были написать это:
void somefunc2(const char amp;char1)
{
return;
}
Комментарии:
1. Отличный ответ! Четкий и лаконичный. Это помогло понять брешь в моих знаниях. Теперь это кажется очень очевидным.
2. Где (т.е. какая переменная / ссылка) здесь является временной?