当前位置:首页 » 编程语言 » c语言将变量类型转换为宏
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言将变量类型转换为宏

发布时间: 2022-05-01 09:40:46

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 #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"。这个例子说明,宏所使用的“#”运算符是一种非常方便的调试工具。 “##”运算符的作用是将两个独立的字符串连接成一个字符串。

⑵ C语言中,宏替换与定义全局变量的区别是什么

全局变量 是可以在程序中任何地方使用 而且是可以修改的 宏定义也可以在任何地方使用 但是不能在之后修改 数据类型没有限制的

⑶ 在C语言中(大一)所有全局变量的声明都可以换成宏定义来实现吗

一般情况下宏不能用来定义变量,是用来定义常量的。你这样既没有必要,也不是建议的做法,绝大部分情况下也做不到

⑷ C语言变量宏替换求助

宏编译解决不了你的动态问题,PMD_INDEX(j)永远只能是PMDj.
宏只在编译时展开处理,不可能随你运行程序要展开.
你可以定个数组:int PMD[] = {PMD1, PMD2, ...., PMD6};
然后程序写成:

backRegster[i] = PMD[j]

⑸ C语言中,宏替换的替换规则

简单来说:宏定义又称为宏代换、宏替换,简称“宏”。宏替换是C/C++的预处理中的一部分,在C++标准中有4条规则来定义替换。

规则1:实参替换。

本条规则描述带参数的宏的替换过程。

对于宏定义中的形参,在替换列表中,如果不是作为#或##的操作数,那么将对应实参完全

展开(相当于对实参进行求值),然后将替换列表中的形参替换掉.如果是#或##的操作数,

那么不进行替换。

规则2:多次扫描。

在所有的形参替换为实参后,对结果进行再次扫描,如果发现还有可替换的宏,则进行替换,

否则中止。

规则3:递归替换抑制。

如果在替换列表中发现当前正在展开的宏的名字,那么这里不进行替换.更进一步,在嵌套

的替换过程中发现已经替换过的宏的名字,则不进行替换。

规则4:递归预处理抑制。

如果替换后的结果形成预处理指令,则不执行这条预处理指令。

看几个C++标准中的例子:

#define x 3

#define f(a) f(x * (a))

#undef x

#define x 2

#define g f

#define z z[0]

#define h g(~

#define m(a) a(w)

#define w 0,1

#define t(a) a

f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);

g(x+(3,4)-w) | h 5) & m(f)^m(m);

其结果分别是

f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);

f(2 * (2+(3,4)-0,1)) | f(2 * ( ~ 5)) & f(2 * (0,1))^m(0,1);

对于第一个,主要在于t(t(g)(0) + t)(1)的展开。

容易计算出最外层的t的实参是f(2 * (0)) + t,而作为t的参数传入时其中的t是

正在被展开的宏,所以根据规则3,不对这个t进行处理,保持不变,得到f(2 * (0)) + t(1)。

对于第二个,h 5)被替换为g(~5),应用规则2,被替换为f(2 * ( ~ 5))。

而m(m)首先被替换为m(w),然后应用规则2再次进行替换,但是m已经是替换过的了,所以保持

不变,只对w进行替换。

#define str(s) # s

#define xstr(s) str(s)

#define debug(s, t) printf("x" # s "= %d, x" # t "= %s",

x ## s, x ## t)

#define INCFILE(n) vers ## n /* from previous #include example */

#define glue(a, b) a ## b

#define xglue(a, b) glue(a, b)

#define HIGHLOW "hello"

#define LOW LOW ", world"

debug(1, 2);

fputs(str(strncmp("abcd", "abc", ’4’) /* this goes away */

== 0) str(: @ ), s);

#include xstr(INCFILE(2).h)

glue(HIGH, LOW);

xglue(HIGH, LOW)

其结果分别是

printf("x" "1" "= %d, x" "2" "= %s", x1, x2);

fputs("strncmp("abc\0d", "abc", ’\4’) = = 0" ": @ ", s);

#include "vers2.h"

"hello";

"hello" ", world"

关键是glue和xglue.

对于glue(HIGH, LOW),首先有一个规则1的抑制,得到HIGHLOW;的结果,然后二次扫描,得到

"hello";

对于xglue(HIGH, LOW)没有抑制效果,所以对参数求值,分别得到HIGH和LOW ", world",即

glue(HIGH, LOW ", world")。

然后进行连接操作得到HIGHLOW ", world",最后再扫描一次得到"hello" ", world"

如果考虑字符串的自然的连接,就可以得到"hello, world"了。

(5)c语言将变量类型转换为宏扩展阅读

宏语言是一类编程语言,其全部或多数计算是由扩展宏完成的。宏语言并未在通用编程中广泛使用,但在文本处理程序中应用普遍。例如, C preprocessor C预处理器Internet Macros(iOpus) M4(如前所述,源于AT&T,捆绑于Unix)

宏定义

c程序提供的预处理功能之一。包括带参数的宏定义和不带参数的宏定义。具体是指用一个指定的标志符来进行简单的字符串替换或者进行阐述替换。形式为:

#define标志符[(参数表)] 字符串

宏名

在上定义中的标志符被称为“宏名”。

宏展开

在c程序编译时将宏名替换成字符串的过程称为“宏展开”。

宏语言是一类编程语言,其全部或多数计算是由扩展宏完成的。宏语言并未在通用编程中广泛使用, 但在文本处理程序中应用普遍。例如,

C preprocessorC 预处理器

Internet Macros(iOpus)

M4(如前所述,源于AT&T,捆绑于Unix)

⑹ C语言宏定义

宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译

宏定义又称为宏代换、宏替换,简称“宏”。
格式:
#define 标识符 字符串
其中的标识符就是所谓的符号常量,也称为“宏名”。
预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。
掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。
即在对相关命令或语句的含义和功能作具体分析之前就要换:
例:
#define PI 3.1415926
把程序中出现的PI全部换成3.1415926
说明:
(1)宏名一般用大写
(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
(4)宏定义末尾不加分号;
(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
(6)可以用#undef命令终止宏定义的作用域
(7)宏定义不可以嵌套
(8)字符串" "中永远不包含宏
(9)宏定义不分配内存,变量定义分配内存。
(10)宏定义不存在类型问题,它的参数也是无类型的。
这样可以么?

⑺ 在C语言中 宏定义是什么

在C语言源程序中,允许用一个标识符来表示一个字符串,称为宏,宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。

(7)c语言将变量类型转换为宏扩展阅读:

宏(Macro),是一种批量处理的称谓。计算机科学里的宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式。

计算机语言如C语言或汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C语言的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C程序员可以获得更精巧的宏。

⑻ C语言:(1)宏替换有数据类型的限制吗(2)宏调用笔函数调用耗费时间吗

(1)没有类型限制,宏替换只是单纯代码文本的替换,不会检测类型。
(2)所谓“宏调用”实际上是在编译阶段将代码替换,在编译完成之后,程序执行时,不存在宏调用的步骤,函数调用是在程序执行时实际调用的,两者没有可比性。