typeof关键字是C语言的应用

原文:http://hi.baidu.com/leowang715/blog/item/b0b96d6f972e7dd080cb4a06.html


typeof关键字是C语言中的一个新扩展。只要可以接受typedef名称,Sun Studio C 编译器就可以接受带有typeof的结构,包括以下语法类别:

  • 声明
  • 函数声明符中的参数类型链表和返回类型
  • 类型定义
  • 类型操作符s
  • sizeof操作符
  • 复合文字
  • typeof实参

编译器接受带双下划线的关键字:__typeof__typeof__。本文中的例子并没有遵循使用双下划线的惯例。从语句构成上看,typeof关键字后带圆括号,其中包含类型或表达式的名称。这类似于sizeof关键字接受的操作数(与sizeof不同的是,位字段允许作为typeof实参,并被解释为相应的整数类型)。从语义上看,typeof 关键字将用做类型名(typedef名称)并指定类型。

使用typeof的声明示例

下面是两个等效声明,用于声明int类型的变量a

typeof(int) a; /* Specifies variable a which is of the type int */ 
typeof('b') a; /* The same. typeof argument is an expression consisting of 
                    character constant which has the type int */

以下示例用于声明指针和数组。为了进行对比,还给出了不带typeof的等效声明。

typeof(int *) p1, p2; /* Declares two int pointers p1, p2 */
int *p1, *p2;

typeof(int) * p3, p4;/* Declares int pointer p3 and int p4 */
int * p3, p4;

typeof(int [10]) a1, a2;/* Declares two arrays of integers */

int a1[10], a2[10];

如果将typeof用于表达式,则该表达式不会执行。只会得到该表达式的类型。以下示例声明了int类型的var变量,因为表达式foo()int类型的。由于表达式不会被执行,所以不会调用foo函数。

extern int foo();
typeof(foo()) var;

使用typeof的声明限制

请注意,typeof构造中的类型名不能包含存储类说明符,如externstatic。不过允许包含类型限定符,如constvolatile。例如,下列代码是无效的,因为它在typeof构造中声明了extern

typeof(extern int) a;

下列代码使用外部链接来声明标识符b是有效的,表示一个int类型的对象。下一个声明也是有效的,它声明了一个使用const限定符的char类型指针,表示指针p不能被修改。

extern typeof(int) b;
typeof(char * const) p = "a";

在宏声明中使用typeof

typeof构造的主要应用是用在宏定义中。可以使用typeof关键字来引用宏参数的类型。

### C语言 `typeof` 的功能与使用方法 #### 1. **`typeof` 关键字的功能** 在某些编译器支持下(如 GCC),`typeof` 是一种扩展语法,允许开发者获取任意表达式的类型并将其作为类型声明的一部分。它类似于其他高级语言中的反射机制,能够动态地捕获类型的定义[^2]。 #### 2. **基本语法结构** `typeof` 的一般形式如下: ```c typeof(expression) variable_name; ``` 这里,`expression` 表示任何合法的 C 表达式,而 `variable_name` 则是基于此表达式类型所创建的新变量名。 #### 3. **实际应用案例** ##### (1) 获取已知变量的类型 通过 `typeof`,可以直接复制某个现有变量的类型而不需显式写出具体数据类型。 ```c #include <stdio.h> int main() { int a = 10; typeof(a) b; // 类型同 'a',即为 int b = 20; printf("b = %d\n", b); return 0; } ``` 上述代码中,`typeof(a)` 自动推导出 `a` 的类型为 `int` 并赋给新变量 `b`[^1]。 ##### (2) 结合复杂表达式 当面对复杂的嵌套指针或者数组时,手动书写类型可能会非常繁琐甚至容易出错;此时利用 `typeof` 能够简化这一过程。 ```c typedef struct Node { int value; } Node; Node* create_node(int val); void example() { Node* node_ptr = NULL; typeof(create_node(5)) new_node = create_node(10); if(new_node != NULL){ printf("New node created with value:%d\n",new_node->value); } } ``` 在此例子中,函数返回值类型被自动解析出来,无需再次重复定义 `Node*`[^4]。 #### 4. **局限性和注意事项** 尽管 `typeof` 提供了极大的便利性,但它并非标准 C 部分的内容,在跨平台开发场景下可能遇到兼容性问题。因此建议仅限于特定场合谨慎采用[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值