Я должен определить 24-битный тип данных. Я использую char[3]
для представления типа. Могу ли я ввести char[3]
определение type24
? Я попробовал это в примере кода. Я положил typedef char[3] type24;
в мой файл заголовка. Компилятор не жаловался на это. Но когда я определил функцию void foo(type24 val) {}
в моем C-файле, он пожаловался. Я хотел бы иметь возможность определять функции, как type24_to_int32(type24 val)
вместо type24_to_int32(char value[3])
.
210
type24 foo
, что бы размеры, типы и значенияfoo
,*foo
,**foo
,&foo
, и&&foo
? Изменились ли значения и законность любых таких выражений с годами?Вы хотите
Объявления типа C странны таким образом. Вы помещаете тип точно в то место, куда будет идти имя переменной, если вы объявляли переменную этого типа.
источник
Из ответа Р .. :
Пользователи, которые не видят, что это массив, скорее всего напишут что-то вроде этого (что не получается):
Он скомпилирует следующие предупреждения:
И выдает следующий вывод:
источник
Массивы не могут быть переданы как параметры функции по значению в C.
Вы можете поместить массив в структуру:
и затем передать это по значению, но, конечно, тогда это менее удобно использовать:
x.byte[0]
вместоx[0]
.Ваша функция
type24_to_int32(char value[3])
фактически передается по указателю, а не по значению. Это в точности эквивалентноtype24_to_int32(char *value)
, и3
игнорируется.Если вы счастливы, передавая указатель, вы можете придерживаться массива и сделать:
Это передаст указатель на массив, а не указатель на первый элемент, поэтому вы используете его как:
Я не уверен, что это действительно выигрыш, так как если вы случайно напишите,
value[1]
произойдет что-то глупое.источник
decay
где-то термин (и, возможно, указав, что ситуация с возвратом массивов хуже - что не работает вообще).Чтобы правильно использовать тип массива в качестве аргумента функции или параметра шаблона, создайте структуру вместо typedef, затем добавьте
operator[]
в структуру, чтобы вы могли сохранить массив как функциональность следующим образом:источник
char&
ни другоеoperator[]
, что существует в C.Вот короткий пример того, почему массив typedef может быть противоречивым. Другие ответы обеспечивают обходной путь.
Это производит вывод
потому что type24 в качестве параметра является указателем. (В C массивы всегда передаются как указатели.) К счастью, компилятор gcc8 выдаст предупреждение по умолчанию.
источник