1. c语言中的“宏”是指什么
是一种批量处理的称谓。计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。
“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。
计算机语言如C语言或 汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C语言的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C程序员可以获得更精巧的宏。
在Objective-C语言源程序中,允许用一个标识符来表示一个字符串,称为宏,被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去替换,这称为宏替换或宏展开。
宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。在Objective-C语言中,宏分为有参数和无参数两种。
(1)c语言非安全宏扩展阅读
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代码调用它们,使用时只需给出这个指令代码就能执行其功能,也可以像调用子程序一样使用。
2. c语言中__func__宏是线程安全的吗
安全的。宏是在预编译阶段处理的,线程是运行时才有的,所以是安全的。
3. C语言的宏(macro)是什么怎样使用宏
#define VERSION—STAMP "1.02" 上例中所定义的这种形式的宏通常被称为标识符。在上例中,标识符VERSION_STAMP即代表字符串"1.02"——在编译预处理时,源代码中的每个VERSION_STAMP标识符都将被字符串“1.02”替换掉。 以下是另一个宏定义的例子: #define CUBE(x)((x),(x)*(x)) 上例中定义了一个名为CUBE的宏,它有一个参数x。CUBE宏有自己的宏体,即((x)*(x)*(x))——在编译预处理时,源代码中的每个CUBE(x)宏都将被((x)*(x)*(x))替换掉。 使用宏有以下几点好处: (1)在输入源代码时,可省去许多键入操作。 (2)因为宏只需定义一次,但可以多次使用,所以使用宏能增强程序的易读性和可靠性。 (3)使用宏不需要额外的开销,因为宏所代表的代码只在宏出现的地方展开,因此不会引起程序中的跳转。 (4)宏的参数对类型不敏感,因此你不必考虑将何种数据类型传递给宏。 需要注意的是,在宏名和括起参数的括号之间绝对不能有空格。此外,为了避免在翻译宏时产生歧义,宏体也应该用括号括起来。例如,象下例中这样定义CUBE宏是不正确的: denne CUBE(x) x * x * x 对传递给宏的参数也要小心,例如,一种常见的错误就是将自增变量传递给宏,请看下例: #include <stdio. h> #include CUBE(x) (x * x * x) void main (void); void main (void){int x, y;x = 5;y = CUBE( + +x); printfC'y is %d\n" . y);}在上例中,y究竟等于多少呢?实际上,y既不等于125(5的立方),也不等于336(6* 7*8),而是等于512。因为变量x被作为参数传递给宏时进行了自增运算,所以上例中的CUBE宏实际上是按以下形式展开的: y = ((++x) * (++x) * (++x)); 这样,每次引用x时,x都要自增,所以你得到的结果与你预期的结果相差很远,在上例中,由于x被引用了3次,而且又使用了自增运算符,因此,在展开宏的代码时,x实际上为8,你将得到8的立方,而不5的立方。 上述错误是比较常见的,作者曾亲眼见过有多年C语言编程经验的人犯这种错误。因为在程序中检查这种错误是非常费劲的,所以你要给予充分的注意。你最好试一下上面的例子,亲眼看一下那个令人惊讶的结果值(512)。 宏也可使用一些特殊的运算符,例如字符串化运算符“#”和。连接运算符“##”。“#”运算符能将宏的参数转换为带双引号的字符串,请看下例: define DEBUG_VALUE(v) printf(#v"is equal to %d.\n",v) 你可以在程序中用DEBUG_VALUE宏检查变量的值,请看下例: int x=20; DEBUG_VALUE(x); 上述语句将在屏幕上打印"x is equal to 20"。这个例子说明,宏所使用的“#”运算符是一种非常方便的调试工具。 “##”运算符的作用是将两个独立的字符串连接成一个字符串。
4. C语言宏定义意思
我继续回答你的追问:
这个 if 由于后面紧跟了;所以什么也不会做,只是把exp执行了一遍,而后面的exse我觉得可能是笔误,应该是else,那么这个宏的意思其实就是,当exp结果为非0(即false)时,那么执行assertion_failure,后面的参数#exp,诚如前面的解答是exp的字符化,而_FILE_ _BASE_FILE_ _LINE_也都是宏,是在c或c++基本库文件中定义好的,分别当前文件名,主程序文件名和该行代码的行数
最后友情提醒下,宏定义尤其是涉及逻辑代码的,最好放在do{ }while(0)里面,这样可以保证其在大多数条件下都可以正常的执行
5. C语言 关于宏的问题
你的宏定义的有问题,宏不是变量,给你改了一下
#include <stdio.h>
#define P 3.5
#define S(x) (P*(x)*(x))
void main()
{
int x=2,y=3,z;
z=S(x+y);
printf("%4d\r\n",z);
}
这个得到的是87,因为你的Z是整形,所以实际上算出来的87.5在赋值的取整得到87。
6. 问一下关于C语言的宏
简单的宏定义有如下格式:
[#define指令(简单的宏)]#define 标识符替换列表
替换列表是一系列的C语言记号,包括标识符、关键字、数、字符常量、字符串字面量、运算符和标点符号。当预处理器遇到一个宏定义时,会做一个 “标识符”代表“替换列表”的记录。在文件后面的内容中,不管标识符在任何位置出现,预处理器都会用替换列表代替它。
7. C语言中的宏
C语言中的宏定义的字是:define
C语言中的define宏定义有带参数的和不带参数两中形式
不带参格式是:#define 宏名 字符串
带参格式是:#define 宏名(参数1,参数2,...) 字符串
在C语言里宏定义只用来做的宏名替换,而不做语法检查的,因而它不是C语句,所以在宏定义的时候不需要在后面加";"
宏也在C里也叫预处理命令,因为宏是在程序编译前先进行字符替换的,所以叫预处理.在C里还有其它的预处理命令如:
#define
#undef
#ifdef
等等