2010-07-16 229 views
4

我想提供一种元素作为参数的类型的指针数组的初始化一个未知的类型的元件typeof的返回类型是什么?

类似

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

和以后调用例如

init(typeof(int)) 

但我无法确定typeof的返回类型是什么。

我想可以用

malloc((type) 0); 

在此先感谢

PS可以实现sizeof_type想:这如果一个矢量implementatin如果有人能指出我的一些flexiblecode我将非常感激,以及

+0

这应该是重新标记,这看起来并不像C在所有 – 2010-07-16 14:11:40

+0

也许这将帮助:http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/gcc/typeof.html也可能是这样的:http://www.accu-usa.org /Listings/2000-05-Listing01.html – FrustratedWithFormsDesigner 2010-07-16 14:12:49

+0

我会非常谨慎的使用typeof(),除非我确定我希望我的程序只能在GNU上工作。 – Uri 2010-07-16 14:15:08

回答

3

我通常不使用GNU(我认为这仅仅是GNU C),但我不认为这是通常意义上的表达,你可以将它的值赋给一个变量并稍后使用它。我认为它只能在非常特定的环境中作为一种类型使用。

From the docs:

使用该关键字 sizeof相似的的语法,但构建物 语义行为像用typedef定义的类型名称 。

可以使用typeof构造可以使用 任何地方可以使用typedef名称。 例如,您可以在 声明中,在演员表中或 sizeof或typeof中使用它。

+1

好学我可以做'typeof(typeof(typof(typeof(c))))',它和'typeof(c)';-)一样 – kriss 2010-07-16 14:24:15

+0

谢谢所以这可能是不可能的。这基本上意味着我必须提供原型数据元素,而不是类型 – Ingo 2010-07-16 15:06:56

2

你想要什么是不可能的。

typeof()并不真的返回一个类型,因为它是一个关键字,它在编译时处评估。它由其参数类型的名称取代。

也许你可以不能使用字符串化操作的预处理,使其一个字符串,像这样## typeof运算(一),但后来它仍然是不可能的malloc /施放的东西时,你有一个字符串的类型。

+0

1.字符串化不起作用,因为在预处理阶段无法评估typeof()。你会得到只是你的麻烦字符串“typeof(a)”。 – atzz 2010-07-16 14:20:26

+0

2.“##”实际上是标记粘合,而不是字符串化。 – atzz 2010-07-16 14:21:23

+0

+1。并删除最后一段,没有任何意义。从你所说的typeof()在编译时估计,那么对于预处理技巧来说就太晚了。 – Dummy00001 2010-07-16 15:03:06

1

此:

#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))

+1

甚至'void * b = INIT(c)'作为'sizeof'接受一个变量(就像有一个隐含的'typeof'一样工作) – kriss 2010-07-16 14:22:28

+0

@kriss:well spotted :) – 2010-07-16 14:24:41

4

为什么你不能只使用sizeof? 类似:

int c; 
void *p = calloc(10,sizeof(c)); 
0

您可以使用宏用于此目的:

#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

没有理由来施放结果。只需使用'void *'来实现它的目的。 (参见铸造被认为有害的malloc的返回值。) – 2010-07-17 20:08:07

+1

@R ..在这种情况下你错了。仔细看看,我**不是**施放malloc()的返回值,所以您的担心不适用于此。我正在转换init_1()的返回值,以便表达式具有适当的类型。这很重要,例如,编译器会标记错误,例如将'INIT(int)'分配给'char *'。在malloc()返回中不使用强制类型转换的目的是为了防止编译器使用返回int的隐式malloc()声明,并将其转换为指向UB的指针类型。 – Juliano 2010-07-18 02:21:51

+0

请注意,因为我实际上并不投射malloc()的返回值,所以如果用户忘记包含,则编译器将发出警告,将int转换为malloc()行中的指针。 #define行中的类型转换是无害的,因为init_1()的定义存在,编译器知道该函数返回一个指针,并且该转换会执行指向转换指针的安全指针,并使表达式具有正确的类型。 – Juliano 2010-07-18 02:26:15

相关问题