`
javatoyou
  • 浏览: 1083518 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

C扩展 typeof 关键字解释

 
阅读更多

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语言GNU扩展语法.doc

    GNU C提供了typeof关键字,可以获取变量的类型,例如: ```c #define min(x, y) ({ const typeof(x) _x = (x); const typeof(y) _y = (y); _x ; }) ``` 这里typeof(x)表示x的值类型,定义了一个与x类型相同的局部...

    GCC核心扩展.doc

    在这个文档中,主要讨论的是GCC对C语言的一些核心扩展,特别是关于语句表达式、typeof关键字、零长度数组、可变参数宏以及标号元素初始化等特性。 1. **语句表达式(Statement Expressions)** GCC提供了一种扩展...

    GNUC扩展用法

    在标准C语言中,结构体赋值通常遵循严格的顺序规则,但在GNU C编译器中,提供了更为灵活的赋值方式,这被称为GNU扩展。下面详细介绍几种赋值方法: 1. **使用大括号初始化成员**: - 传统上,结构体初始化需要按照...

    gcc扩展用法gcc扩展用法

    本文详细介绍了GCC的一些关键扩展特性,包括语句表达式、typeof关键字、零长度数组、可变参数宏和标号元素。通过这些特性的合理运用,不仅可以让代码变得更加灵活和高效,还能显著提高程序的可读性和可维护性。对于...

    GNU C扩展 学习记录

    GNU C扩展是GNU编译器集合(GCC)提供的非标准C语言特性,旨在为开发者提供额外的功能和优化手段。这些扩展不仅提高了编程灵活性,还增强了代码的安全性和性能。本文将详细介绍一些常用的GNU C扩展,并通过实例进行...

    gnu对c语言的扩展

    1. **内联函数**:C语言标准中没有内联函数的概念,但在GNU C中,通过`inline`关键字,程序员可以请求编译器尝试将函数体插入到每个调用处,以减少函数调用的开销。 2. **变长参数列表**:标准C语言中,函数的参数...

    如何在C语言的宏中使用类型关键字

    4. **使用`__typeof__`或`typeof`扩展**:在某些情况下,如GCC扩展中,可以使用`__typeof__`(或`typeof`,取决于编译器支持)来获取表达式的类型,这在编写更复杂的宏时可能更安全。 5. **避免宏滥用**:虽然宏在...

    GNU C 与ANSI C的比较

    GNU C 引入了 `typeof` 关键字,它可以用来获取变量的类型,从而在编译时确定类型信息。例如,使用 `typeof` 重写上述 `min_t` 宏: ```c #define min(x, y) ({ const typeof(x) _x = (x); const typeof(y) _y = (y...

    LINUX内核中的GCC特性

    GCC支持的C语言扩展特性非常广泛,其中最重要的是类型发现、范围扩展等功能性扩展,以及一系列有助于生成高效代码的优化扩展。下面我们将逐一介绍这些特性。 ##### 1. 类型发现 类型发现是一种非常有用的特性,它...

    C语言常用符号简单总结备忘.pdf

    - **typeof关键字**: 用于获取类型的信息。 - **可变参数的宏**: 允许宏接受可变数量的参数。 - **标号元素**: 在结构体或联合体内定义具有特定偏移量的成员。 - **特殊属性声明**: 为变量或函数添加特殊属性。 - **...

    GNU C Language Extension

    以上列举的GNU C语言扩展特性是专业C程序员应该了解和掌握的关键知识点,它们不仅可以提高代码的效率和功能,还可以帮助解决复杂编程问题。然而,在使用这些特性时,也应注意到可能带来的代码可读性和兼容性问题,...

    linux内核中的min、max函数1

    __extension__ 是 GCC 的一个扩展关键字,用于标记一个语句或表达式为扩展语法。例如,在 min 宏定义中,__extension__ 用于标记 statement list 为扩展语法。 使用 typeof 和({})实现 min,避免了副作用 ---------...

    Linux内核GCC特性

    GCC(GNU Compiler Collection)是GNU项目的一部分,它不仅是一个C语言编译器,还包含其他语言的编译器如C++、Objective-C、Fortran等。Linux作为开源操作系统的核心,其内核开发离不开强大的编译工具支持。GCC提供...

    GCC中文手册

    - `-fno-asm`:禁止将`asm`, `inline`, `typeof`作为关键字使用,符合ANSI C标准。 - `-fno-strict-prototype`:仅对g++有效,允许不带参数声明的函数。 - `-fthis-is-variable`:使`this`关键字可以像普通变量一样...

    G++编译器主要命令[文].pdf

    - `-fno-asm`:禁止将`asm`、`inline`和`typeof`作为关键字。 - `-fno-strict-prototype`:对g++而言,允许不带参数声明的函数。 - `-fthis-is-variable`:允许将`this`作为普通变量使用,用于兼容传统的C++风格。 -...

    Linux中gcc g++常用编译选项

    -fno-asm:禁止将 asm、inline 和 typeof 用作关键字。 -fno-strict-prototype:对 g++ 生效,使用这个选项,g++ 将对不带参数的函数都认为没有显式的对参数的个数和类型说明。 -fthis-is-variable:使得 this ...

    GCC 参数详解.pdf

    - 功能:关闭GNU C中与ANSI C不兼容的特性,并启用ANSI C的特定功能,如禁用某些特定的关键字如`asm`, `inline`, `typeof`等,并取消一些预处理宏如`UNIX`, `vax`等。 9. **-fno-asm**: - 功能:进一步实现`-...

Global site tag (gtag.js) - Google Analytics