C++/C宏定义中## 连接符与# 符的含义拜托各位大神

供稿:hz-xin.com     日期:2025-01-13
关于宏定义的问题,总报错,求大神解释一下!

#define N_MOVIES 3; 后面分号去掉 宏定义后面不用分号

否则 替换完毕就成了

struct movies_t{
char name[30];
int year;
}alen [3;]; 了 当然就错了

(一)宏定义中的## 连接符与# 符
## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。同时值得注意的是#符是把传递过来的参数当成字符串进行替代。下面来看看它们是怎样工作的。这是MSDN上的一个例子。
假设程序中已经定义了这样一个带参数的宏:
#define paster( n ) printf( "token" #n " = %d", token##n )
同时又定义了一个整形变量:
int token9 = 9;
现在在主程序中以下面的方式调用这个宏:
paster( 9 );
那么在编译时,上面的这句话被扩展为:
printf( "token" "9" " = %d", token9 );
注意到在这个例子中,paster(9);中的这个”9”被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代。
可想而知,上面程序运行的结果就是在屏幕上打印出token9=9

(二)"\"与一个较长占多行的宏
宏定义中允许包含两行以上命令的情形,此时必须在最右边加上"\"且该行"\"后不能再有任何字符,连注释部分都不能有,下面的每行最后的一定要是"\","\"后面加一个空格都会报错,更不能跟注释。
#define exchange(a,b) {\
int t;\
t=a;\
a=b;\
b=t;\
}

## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。同时值得注意的是#符是把传递过来的参数当成字符串进行替代。下面来看看它们是怎样工作的。这是MSDN上的一个例子。 假设程序中已经定义了这样一个带参数的宏: #define paster( n ) printf( "token" #n " = %d", token##n ) 同时又定义了一个整形变量: int token9 = 9; 现在在主程序中以下面的方式调用这个宏: paster( 9 ); 那么在编译时,上面的这句话被扩展为: printf( "token" "9" " = %d", token9 ); 注意到在这个例子中,paster(9);中的这个”9”被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代。 可想而知,上面程序运行的结果就是在屏幕上打印出token9=9 (查找到的)

记得采纳啊

c语言宏定义函数如何调用?
(2)宏函数定义要注意格式,尤其是括号。如果上面的宏函数写成 #define MAX(a, b) (a>b?a:b),省去内层括号,则宏展开就成了k = (i&0x0f>j&0x0f?i&0x0f:j&0x0f),运算的优先级就错了。同样道理,这个宏定义的外层括号也是不能省的。若函数中是宏替换为 ++MAX(a,b),则宏展开...

c语言 define 怎么用的
上例程序中首先进行宏定义,定义M表达式(y*y+3*y),在s= 3*M+4*M+5* M中作了宏调用。在预处理时经宏展开后该语句变为:s=3*(y*y+3*y)+4* (y*y+3*y)+5* (y*y+3*y);但要注意的是,在宏定义中表达式(y*y+3*y)两边的括号不能少。否则会发生错误。带参数宏定义 C语言允许宏带有参数。

C++ 宏定义问题,为什么不等于10 而等于1
define P(a,b,c,d,e,f,g...)参数可以随便设,宏定义其实是一个预处理替换,只是你要将对应的参数执行正确的操作。在C++中宏定义一系列简单操作的话可以用inline函数来替换,编译器对inline函数的处理是把接受了参数的inline函数的函数体和目标代码进行替换,有点像宏但比宏安全。例如:#define P(...

C语言,#define语句的用法。
8.预定义宏 在C语言中收录了一些有用的宏,这些宏是提供当前编译信息的。__LINE__ 被编译文件的行数 (整型)__FILE__ 被编译文件的名字 (字符型)__DATE__ 编译日期 (字符型)__TIME__ 编译时间 (字符型)__STDC__ 如果编译器接受标准C,那么值为1. (整型)通常在编译的时...

VC++ 6.0中 宏定义#define NULL 0之后,see previous definition of 'NUL...
没错!!你定义的这个NULL是多余的!!编译系统已经在Stdio.h里面早就定义好了 define NULL 0 所以在你使用Stdio.h这个头文件时定义NULL会出现错误,因为NULL本身已经是0了,经过 预处理器处理后就变成了#define 0 0 如此会没错吗???

关于c语言循环结构字母三角形
请参考这个程序: 主要是KG,XH,FH几个宏定义的设计 define KG i define XH ((n-i)*2-1)define FH (XH\/2-abs(XH\/2-j))void main() { int i,j,k,n; char s[20],c;while ( 1 ) { printf("\\n"); scanf("%s",s); c=s[0]; if ( c=='#' ) break;if ( c>='A' ...

在VC++中如何查看宏的展开?
当程序编译时,编译器首先要执行一个“替换”源程序的动作,把宏引用的地方替换成宏定义的语句块,就像文本文件替换一样。很多程序员不知道C中的“宏”到底是什么意思?特别是当宏有参数的时候,经常把宏和函数混淆。我想在这里我还是先讲讲“宏”,宏只是一种定义,他定义了一个语句块,当程序编译时...

#ifdef #define 是什么意思?
作用: 被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。 宏定义的作用范围仅限于当前文件,即file1.c中定义 #defin...

C语言中使用宏定义多次赋值的问题
宏属于预处理,在编译之前完成替换,因此你的描述应该是做不到的。其实你如果要定义1000个宏,不如直接定义一次数组,然后在初值表赋值了,然后把该数组的内容再赋值给B。int A[1000]={0x5,0xA,)x20,...};

C语言宏定义#define的理解与资料整理!希望你能get到!
定义宏函数时,注意实参代换规则,避免值传送。例如:define SQR (x) x * x 定义求平方的宏函数。在使用宏函数时,确保参数正确代换。宏定义中的空格 宏定义时,注意空格使用。在定义宏时,空格有特定作用,但在使用宏时,空格会被忽略。例如:define SUM (x) (x) + (x)定义求和宏函数时,避免...