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构造中的类型名不能包含存储类说明符,如extern或static。不过允许包含类型限定符,如const或volatile。例如,下列代码是无效的,因为它在typeof构造中声明了extern:
typeof(extern int) a;
下列代码使用外部链接来声明标识符b是有效的,表示一个int类型的对象。下一个声明也是有效的,它声明了一个使用const限定符的char类型指针,表示指针p不能被修改。
extern typeof(int) b;
typeof(char * const) p = "a";
在宏声明中使用typeof
typeof构造的主要应用是用在宏定义中。可以使用typeof关键字来引用宏参数的类型。因此,在没有将类型名明确指定为宏实参的情况下,构造带有所需类型的对象是可能的。
分享到:
相关推荐
GNU C提供了typeof关键字,可以获取变量的类型,例如: ```c #define min(x, y) ({ const typeof(x) _x = (x); const typeof(y) _y = (y); _x ; }) ``` 这里typeof(x)表示x的值类型,定义了一个与x类型相同的局部...
在这个文档中,主要讨论的是GCC对C语言的一些核心扩展,特别是关于语句表达式、typeof关键字、零长度数组、可变参数宏以及标号元素初始化等特性。 1. **语句表达式(Statement Expressions)** GCC提供了一种扩展...
在标准C语言中,结构体赋值通常遵循严格的顺序规则,但在GNU C编译器中,提供了更为灵活的赋值方式,这被称为GNU扩展。下面详细介绍几种赋值方法: 1. **使用大括号初始化成员**: - 传统上,结构体初始化需要按照...
本文详细介绍了GCC的一些关键扩展特性,包括语句表达式、typeof关键字、零长度数组、可变参数宏和标号元素。通过这些特性的合理运用,不仅可以让代码变得更加灵活和高效,还能显著提高程序的可读性和可维护性。对于...
GNU C扩展是GNU编译器集合(GCC)提供的非标准C语言特性,旨在为开发者提供额外的功能和优化手段。这些扩展不仅提高了编程灵活性,还增强了代码的安全性和性能。本文将详细介绍一些常用的GNU C扩展,并通过实例进行...
1. **内联函数**:C语言标准中没有内联函数的概念,但在GNU C中,通过`inline`关键字,程序员可以请求编译器尝试将函数体插入到每个调用处,以减少函数调用的开销。 2. **变长参数列表**:标准C语言中,函数的参数...
4. **使用`__typeof__`或`typeof`扩展**:在某些情况下,如GCC扩展中,可以使用`__typeof__`(或`typeof`,取决于编译器支持)来获取表达式的类型,这在编写更复杂的宏时可能更安全。 5. **避免宏滥用**:虽然宏在...
GNU C 引入了 `typeof` 关键字,它可以用来获取变量的类型,从而在编译时确定类型信息。例如,使用 `typeof` 重写上述 `min_t` 宏: ```c #define min(x, y) ({ const typeof(x) _x = (x); const typeof(y) _y = (y...
GCC支持的C语言扩展特性非常广泛,其中最重要的是类型发现、范围扩展等功能性扩展,以及一系列有助于生成高效代码的优化扩展。下面我们将逐一介绍这些特性。 ##### 1. 类型发现 类型发现是一种非常有用的特性,它...
- **typeof关键字**: 用于获取类型的信息。 - **可变参数的宏**: 允许宏接受可变数量的参数。 - **标号元素**: 在结构体或联合体内定义具有特定偏移量的成员。 - **特殊属性声明**: 为变量或函数添加特殊属性。 - **...
以上列举的GNU C语言扩展特性是专业C程序员应该了解和掌握的关键知识点,它们不仅可以提高代码的效率和功能,还可以帮助解决复杂编程问题。然而,在使用这些特性时,也应注意到可能带来的代码可读性和兼容性问题,...
__extension__ 是 GCC 的一个扩展关键字,用于标记一个语句或表达式为扩展语法。例如,在 min 宏定义中,__extension__ 用于标记 statement list 为扩展语法。 使用 typeof 和({})实现 min,避免了副作用 ---------...
GCC(GNU Compiler Collection)是GNU项目的一部分,它不仅是一个C语言编译器,还包含其他语言的编译器如C++、Objective-C、Fortran等。Linux作为开源操作系统的核心,其内核开发离不开强大的编译工具支持。GCC提供...
- `-fno-asm`:禁止将`asm`, `inline`, `typeof`作为关键字使用,符合ANSI C标准。 - `-fno-strict-prototype`:仅对g++有效,允许不带参数声明的函数。 - `-fthis-is-variable`:使`this`关键字可以像普通变量一样...
- `-fno-asm`:禁止将`asm`、`inline`和`typeof`作为关键字。 - `-fno-strict-prototype`:对g++而言,允许不带参数声明的函数。 - `-fthis-is-variable`:允许将`this`作为普通变量使用,用于兼容传统的C++风格。 -...
-fno-asm:禁止将 asm、inline 和 typeof 用作关键字。 -fno-strict-prototype:对 g++ 生效,使用这个选项,g++ 将对不带参数的函数都认为没有显式的对参数的个数和类型说明。 -fthis-is-variable:使得 this ...
- 功能:关闭GNU C中与ANSI C不兼容的特性,并启用ANSI C的特定功能,如禁用某些特定的关键字如`asm`, `inline`, `typeof`等,并取消一些预处理宏如`UNIX`, `vax`等。 9. **-fno-asm**: - 功能:进一步实现`-...