1. 预处理命令的宏定义
1.不带参数的宏定义:
宏定义又称为宏代换、宏替换,简称“宏”。
格式:
#define标识符文本
其中的标识符就是所谓的符号常量,也称为“宏名”。
预处理(预编译)工作也叫做宏展开:将宏名替换为文本(这个文本可以是字符串、可以是代码等)。
掌握宏概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。
即在对相关命令或语句的含义和功能作具体分析之前就要换:
例:
#define PI 3.1415926
把程序中全部的标识符PI换成3.1415926
说明:
(1)宏名一般用大写
(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
(3)可以用#undef命令终止宏定义的作用域
(4)宏定义可以嵌套
2.带参数的宏:
除了一般的字符串替换,还要做参数代换
格式:
#define 宏名(参数表)文本
例如:#define S(a,b) a*b
area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2;
类似于函数调用,有一个哑实结合的过程:
(1)实参如果是表达式容易出问题
#define S(r) r*r
area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;
正确的宏定义是#define S(r) ((r)*(r))
(2)宏名和参数的括号间不能有空格
(3)宏替换只作替换,不做计算,不做表达式求解
(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存
(5)宏的哑实结合不存在类型,也没有类型转换。
(6)宏展开使源程序变长,函数调用不会
(7)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)
2. Verilog的编译指令
Verilog编译指令详解
编译指令包括 `celldefine 和 `endcelldefine、default_nettype、`define 和 `undef、`ifdef、`else、`elsif、`endif、`ifndef、`include、`timescale、`unconnected_drive、`nounconnected_drive、`begin_keywords、`end_keywords、`pragma。
`celldefine 和 `endcelldefine 用于定义和结束宏定义。
`default_nettype 编译指令用于设置默认的网线类型,选项包括 auto、wire、reg、bipol、mem。
`define 和 `undef 分别用于定义和取消宏定义。
`ifdef、`else、`elsif、`endif、`ifndef 与C语言中的同名指令类似,用于条件编译。
`include 用于在源文件中包含另一个文件,可插入宏定义或函数,方便代码管理。
`timescale 用于设置仿真的时间单位和精度。
`unconnected_drive 和 `nounconnected_drive 分别用于指定未连接端口的默认上拉或下拉状态。
`begin_keywords 和 `end_keywords 用于定义代码块的开始和结束。
`pragma 是一条改变Verilog源程序解释的指令,但具体作用未知。
Verilog中的编译指令各有用途,合理使用可提高代码的可维护性和可读性。
3. c语言中的“宏”是指什么
是一种批量处理的称谓。计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。
“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。
计算机语言如C语言或 汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C语言的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C程序员可以获得更精巧的宏。
在Objective-C语言源程序中,允许用一个标识符来表示一个字符串,称为宏,被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去替换,这称为宏替换或宏展开。
宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。在Objective-C语言中,宏分为有参数和无参数两种。
(3)宏定义停止编译扩展阅读
A类宏是用G65 Hxx P#xx Q#xx R#xx或G65
Hxx P#xx Qxx
Rxx格式输入的,xx的意思就是数值,是以um级的量输入的,比如你输入100那就是0.1MM #xx就是变量号,变量号就是把数值代入到一个固定的地址中,固定的地址就是变量。
一般OTD系有#0~#100~#149~#500~#531.关闭电源时变量#100~#149被初始化成“空”,而变量#500~#531保持数据。我们如果说#100=30那么现在#100地址内的数据就是30了。
B类宏能完成某一功能的一系列指令像子程序那样存入存储器,用户可以设定M、S、T、G代码调用它们,使用时只需给出这个指令代码就能执行其功能,也可以像调用子程序一样使用。
4. C#必备知识之预编译指令
预编译又称为预处理 是做些代码文本的替换工作 处理#开头的指令 比如拷贝#include包含的文件代码 #define宏定义的替换 条件编译等 就是为编译做的预备工作的阶段 主要处理#开始的预编译指令
下面对C#中的预编译指令进行介绍
#define和#undef
用法
#define DEBUG
#undef DEBUG
#define告诉编译器 我定义了一个DEBUG的一个符号 他类似一个变量 但是它没有具体的值 可以将它看为一个符号而已 #undef就是删除这个符号的定义 如果符号DEBUG没定义过 则#undef不起作用 否则#define不起作用 二者都必须放在源代码之前 二者的顺序看代码的顺序
#define DEBUG
#undef DEBUG
这样的话 DEBUG是没有定义的 如果二者换个顺序 编译器就认为DEBUG被定义了
#if #elif #else #endif
这个告诉编译器进行编译代码的流程控制 考虑下面代码
#if DEBUG Console Write( debug );#elif RELEASE Console Write( realse );#else Console Write( other );#endif以上代码就是说如果定义了DEBUG则输出debug 定义了RELEASE 则输出realse 否则输出other 如果定义了DEBUG和REALSE会怎么样呢?各位可以自己试一下
#warning #error
通过这两个指定可以告诉编译器 出一个警告还是错误信息 除了错误信息以后 编译将停止
参考下面的代码
#if DEBUG 〉该DEBUG如果选中当前状态为DEBUG 则这个默认为#define #warning 现在是Ddbug状态 #elif RELEASE 〉如果选中release状态的话 这个确没有默认 不知道我试验的对不对 #warning 现在是Realse状态 #else #error 并清楚什么状态 #endif#region 和#endregion
这个两个用来组成代码块
#line (这个指定的使用不太明白 参考MSDN)
这个指令可以改jian变编译器在警告和错误信息中显示的文件名和行号信息 用#line default把行号恢复为默认的行号
下面的示例说明如何报告与行号关联的两个警告 #line 指令迫使行号为 (尽管默认值为 # ) 另一行 (# ) 作为默认 #line 指令 的结果跟在通常序列后
示例
// preprocessor_line cspublic class MyClass { public static void Main() { #line int i; // CS on line #line default char c; // CS on line }}示例
下面的示例说明调试器如何忽略代码中的隐藏行 运行此示例时 它将显示三行文本 但是 当设置如示例所示的断点并按 F 键逐句通过代码时 您将看到调试器忽略了隐藏行 另请注意 即使在隐藏行上设置断点 调试器仍会忽略它
lishixin/Article/program/net/201311/15246
5. c语言宏定义如何用用宏定义有什么优点
用#define 来定义,如#define Max 100
优点:在以后的程序中 要修改Max的大小 不用跑到程序中找 直接修改
#define Max 的大小即可。很方便。