какой тип возврата typeof? - PullRequest
4 голосов
/ 16 июля 2010

Я хочу указать тип элемента в качестве параметра для инициализации массива указателей на элемент неизвестного типа

что-то вроде

void* init(type t)
  void* array = malloc(sizeof_type(t)*10));
  return array;
}

и позже, например, позвоните

   init(typeof(int))

Но я не смог понять, какой тип возврата у typeof.

Я думаю, что sizeof_type может быть достигнут с помощью

   malloc((type) 0);

Заранее спасибо

PS: это если для векторного внедрения, если кто-то может указать мне какой-то гибкий код, я был бы также очень благодарен

Ответы [ 6 ]

3 голосов
/ 16 июля 2010

Почему вы не можете просто использовать sizeof?что-то вроде:

int c;
void *p = calloc( 10,sizeof(c) );
3 голосов
/ 16 июля 2010

Я обычно не использую gnu (я думаю, что это только в gnu C), но я не думаю, что это выражение в обычном смысле, что вы можете присвоить его значение переменной и позже использовать его Я думаю, что он может использоваться только в очень специфических контекстах как тип.

Из документов:

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

Может использоваться typeof-конструкция везде можно использовать имя typedef. Например, вы можете использовать его в декларация, в гипсе или внутри sizeof или typeof.

2 голосов
/ 16 июля 2010

То, что вы хотите, не возможно.

typeof () на самом деле не возвращает тип, поскольку это ключевое слово, которое оценивается в время компиляции . Он заменяется именем для типа его параметра.

Может быть, вы можете Вы не можете использовать оператор преобразования строк препроцессора, чтобы сделать его строкой, например ## typeof (a), но тогда это все равно будет невозможно Malloc / Cast что-то, когда у вас есть тип в строке.

1 голос
/ 16 июля 2010

Это:

#define INIT(t) (malloc(sizeof(t) * 10))

можно использовать так:

int* a = INIT(int);

или, возможно, так:

void* b = INIT(typeof(c));

или даже это:

void* b = INIT(c);

с sizeof(c) == sizeof(typeof(c)).

0 голосов
/ 16 июля 2010

Вы можете использовать макрос для этой цели:

#define INIT(t) ((t*) init_1(sizeof(t)))

void *init_1(size_t sz) {
  void *array = malloc(sz * 10);
  return array;
}

Затем вы используете как:

int *array = INIT(int);
0 голосов
/ 16 июля 2010

Я знаю, что ваш вопрос не был помечен как таковой, но если вам удается использовать C ++, возможно, вы захотите изучить использование шаблонных классов.Такие библиотеки, как STL, используют шаблоны для предоставления (типа) универсальных контейнеров и алгоритмов.

http://www.cplusplus.com/doc/tutorial/templates/

http://en.wikipedia.org/wiki/Template_%28programming%29

...