C 的元素
Vue 支持 C 的子集。
下表描述了 ProbeVue 编译器如何为指定的 C 关键字提供支持。 所有 C 关键字在 Vue中都保持受限状态。 将这些关键字的任何一个用作变量名称或其他符号并不会标记为语法错误,但是未定义此类用法的行为。
注: 第二列中的关键字可以存在于类型或结构定义或函数声明中。 Vue 编译器将忽略它们。 但是,声明 Vue 脚本变量时不得应用这些关键字。
| 支持 | 允许用于头文件或声明部分 | 不支持 |
|---|---|---|
| char | auto | break |
| double | const | case |
| else | extern | 继续 |
| enum | 注册 | 缺省值 |
| float | 静态 | do |
| if | typedef | for |
| 整数 | volatile | goto |
| 长整型 | switch | |
| 回车 | while | |
| 简短 | ||
| 已签名 (signed) | ||
| sizeof | ||
| struct | ||
| 并集 (union) | ||
| unsigned | ||
| void |
以下列表描述了 Vue 支持的 C 功能集:
- 语句
- 除循环和一些控制流声明以外的所有 C 声明。
- 运算符
- 除逗号运算符以外的所有 C 一元、二元和三元运算符。 运算符优先级和关联性遵循 C 语言规则。
- 数据类型
- C-89 定义的大多数合法变量类型,包括所有语句和关键字(Struct、union、enum 和 typedef 等),用来声明类型并遵循一定的限制。 这包括用于内核或应用程序变量和参数的类型。注: Vue 在作用域和存储类上有自己的规则。
- 类型转换
- 隐式类型转换和具有类型强制类型转换的显式转换。
- 子例程
- 用于调用子例程并将参数传送到函数的语法。 但是,对可以调用的函数存在一些限制。
- 变量名称
- 变量的命名约定遵循 C 标识规则。 如果变量类名是变量名称的前缀,那么完整的变量规范可包括冒号。
- 头文件
- 可包括头文件,以便显式地声明应用程序和内核中内核全局变量的类型或函数的原型。 对于如何包括头文件有一些限制。
- 标点
- 支持所有的 C 标点并实施它们的规则。 因此,语句必须用分号 (;) 字符分隔。 遵循所有的 C 空格规则。
- 字面值
- 字符串的表示(使用双引号字符 ("))、字符文字(使用单引号字符 ('))、八进制和十六进制整数以及特殊字符(如 \n 和 \t 转义序列)。
- 注释
- C 样式和 C++ 样式的注释。 注释可出现在子句的内部和外部。 将忽略任何以 # 字符开头的行。 避免使用此字符来表示注释行。
与 C 语言的差别
对于某些 C 功能部件, Vue 具有不同的行为。 为了保持效率或确保可以在内核中安全地发出 Vue 脚本并且它不会影响被探测的进程,施加了一些限制。
- 循环语句
- Vue 脚本不接受循环语句。 这是防止任何 Vue 探测器永远无法完成的预防措施。
- 条件流语句
- Vue 脚本仅接受 "if-else" 样式控制流语句。 可通过正确使用“if”语句来完成大多数条件逻辑流。 谓词是在 Vue 脚本中执行高级条件逻辑的更有效方法。
- return 语句
- Vue 接受 return 语句以指示要立即结束操作块的执行。 但是, return 语句不会在 Vue中采用任何表达式,因为 Vue 操作块没有返回值。
- 子例程
- Vue脚本无法访问AIX®系统或一般用户库提供的功能。 不支持创建归档(函数库)或可从调查调用的用户函数。 而您可以使用特殊的内部库,其中提供了一组通常对动态跟踪程序有用的函数。
- 浮点
- 与内核探针点相关联的任何子句都不接受浮点变量。 只能在简单赋值语句中使用浮点变量,并将其用作打印数据的 Vue 函数的参数。 对浮点变量的 Vue 语言支持仅限于其捕获。
- 变量修改
- 赋值语句的左侧不接受外部变量,即不能在 Vue 脚本中修改这些变量。
- 头文件
- Vue 不支持在 Vue 脚本本身中显式包含头文件。 但是,要包括的头文件的名称必须通过命令行参数传送到 probevue 命令。 将忽略头文件中的任何 C 预处理器运算符或伪指令。 这可能会导致意外行为。 要避免发生此情况,请对头文件进行硬编码,或对相关头文件集直接显式地运行 C 预处理器并生成要包括的后处理头文件。 可以在 Vue 脚本本身中包含函数原型和结构或并集定义 (如果它们是在启动任何探针子句之前的最开头插入的)。
- C 预处理器
- 将忽略 C 预处理器运算符、宏定义、行或编译指示伪指令以及预定义的宏名称。
- 指针操作
- Vue 不接受指向脚本变量的指针。 例如,无法采用脚本变量的地址。 但是,可以获取内核变量的地址并将其分配给 Vue 指针变量以及使用该指针变量支持的指针操作。
- 其他项
- 不接受三线图。
- 不接受逗号运算符。
- 声明语句不能包含任何初始化。