首页 > 电脑 > c语言中一个项目如果若干个封装的文件的入口为宏定义,如何在编译中按顺序进行宏定义

c语言中一个项目如果若干个封装的文件的入口为宏定义,如何在编译中按顺序进行宏定义

电脑 2022-05-24

c语言的宏定义有哪些技巧

1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。 typedef unsigned char boolean; /* Boolean value type. */ typedef unsigned long int uint32; /* Unsigned 32 bit value */ typedef unsigned short uint16; /* Unsigned 16 bit value */ typedef unsig

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

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

扩展资料:

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

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

参考资料:

宏定义百度百科

C语言中宏定义的问题.在一个较大的系统中,会有多个

多个宏定义 需要尽量避免同名 不是通用的宏定义 尽量定义在C文件中 而不是头文件中 必须定义在头文件中的,可以加上所在模块名 比如 宏名为GET_ITEM 所在模块为INPUT 那么定义为INPUT_GET_ITEM

C语言宏定义条件编译问题2

#include #define DEBUG int main() { int x=1,y=2,z=3; #ifdef DEBUG printf("%d,%d,%d\n",x,y,z); #endif return 0; } 你先试试这个这个程序看看有没有输出,然后再把#define DEBUG删掉重新运行程序看看。

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("abc\0d", "abc", ’\4’) /* this goes away */

== 0) str(: @\n), 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" ": @\n", 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"了。

扩展资料

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

宏定义

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

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

宏名

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

宏展开

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

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

C preprocessorC 预处理器

Internet Macros(iOpus)

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

参考资料来源:百度百科-宏


标签:C(编程语言) C语言 CC++ 编程语言 信息技术

大明白知识网 Copyright © 2020-2022 www.wangpan131.com. Some Rights Reserved.