2012-03-16 7 views
-4

Мы все знакомы с работой оператора sizeof на языке C. Я пытаюсь создать аналогичную рабочую функцию, которая поглотит любой тип данных и вернет мне размер.Оператор c sizeOf: хотите сделать функцию myOwnSizeOf()

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

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

Благодаря

+4

Что не так с оригинальным 'sizeof'? – PeterK

+0

у вас есть ребята ANSWER? –

+1

Это * оператор * по какой-то причине. Вы не можете. –

ответ

1

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

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

7

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

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

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

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

+0

Спасибо .. но нет никакого способа потреблять какой-либо тип данных во время выполнения, как в объективе C ("id"). –

+0

void pointer: 'void *' (что, конечно же, вам не поможет) –

+1

@Pankaj: Нет, не на C. Как указывает Брайан, вы можете попытаться передать адрес переменной как 'void *' (это означает, что вы не можете передавать целочисленные или плавающие литералы в качестве аргументов), но затем вы выбрали именно ту информацию о типе, которая вам нужна. C просто не поддерживает какой-либо способности отражения, по крайней мере, не изначально. –

0

Функция не может это сделать, но макрос может, если вы не возражаете бросать в небольшой технической 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) 
+0

эй, эй, нет необходимости в UB –

+0

У вас есть версия без UB, но я не предложил эту модификацию? –

+0

что-то вроде 'offsetof (struct {T a; char b}, b)' :) –

Смежные вопросы