Оператор C sizeOf: хочу сделать функцию myOwnSizeOf () - PullRequest
0 голосов
/ 16 марта 2012

Мы все знакомы с работой оператора sizeof на языке Си. Я пытаюсь создать аналогичную рабочую функцию, которая будет поглощать любой тип данных и возвращать мне его размер.

Может кто-нибудь сказать мне, как сделать подобную функцию в "C".

int myOwnSizeOf(/*what would be parameter type?*/)
{
    //and what about the definition?
}

Спасибо

Ответы [ 3 ]

7 голосов
/ 16 марта 2012

Вы не можете сделать это с помощью функции. Вот почему sizeof является оператором, встроенным в язык, а не библиотечной функцией. Это волшебство.

Вы могли бы сделать

#define myOwnSizeOf(x) (sizeof(x))

но я не вижу смысла.

1 голос
/ 16 марта 2012

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

Вы можете заставить его работать для этого ограниченного случая в C ++ с помощью функции шаблона.Но в C вашими единственными возможностями использовать объект любого типа данных являются либо пустые указатели, либо макросы.Но первый, конечно, не сработает, поскольку он теряет информацию о типах, а второй уже был предложен Ашеплером, и, как он отметил, он ничего вам не купит (и в любом случае это не функция).

0 голосов
/ 16 марта 2012

Функция не может этого сделать, но макрос может, если вы не возражаете, добавить немного технического UB, который не может / не будет иметь большого значения:

#define mysizeof(T) (size_t)((char *)((T*)0+1)-(char *)0)

Если вызаменив 0 на адрес объекта статической длительности хранения, который больше, чем любой другой объект, размер которого вы когда-либо пытались бы принять, UB исчезнет.

Редактировать: Примечаниечто это для типов T;версия для переменных намного проще:

#define mysizeof(v) (size_t)((char *)(&v+1)-(char *)&v)
...