关于C++宏定义问题
发布网友
发布时间:2022-05-07 05:21
我来回答
共2个回答
热心网友
时间:2023-09-14 11:16
C++
宏定义
将一个
标识符
定义为一个字符串,
源程序
中的该标识符均以指定的字符串来代替。前面已经说过,
预处理命令
不同于一般C++语句。因此预处理命令后通常不加分号。这并不是说所有的预处理命令后都不能有分号出现。由于宏定义只是用宏名对一个字符串进行简单的替换,因此如果在宏定义命令后加了分号,将会连同分号一起进行置换。
定义带参数的宏时,宏体中与参数名相同的字符串适当地加上
圆括号
是十分重要的,这样能够避免
可能产生的错误。例如,对于宏定义:
#define
SQ(x)
x*x
当程序中出现下列语句:
m=SQ(a+b);
替换结果为:
m=a+b*a+b;
这可能不是我们期望的结果,如果需要下面的替换结果:
m=(a+b)*(a+b);
应将宏定义修改为:
#define
SQ(x)
(x)*(x)
对于带参的宏定义展开置换的方法是:在程序中如果有带
实参
的宏(如"SUB(2,3)"),则按"#define"命令行中指定的字符串从左到右进行置换。如果串中包含宏中的
形参
(如a、b),则将程序语句中相应的实参(可以是常量、变量或者表达式)代替形参,如果宏定义中的字符串中的字符不是参数字符(如a-b中的-号),则保留。这样就形成了置换的字符串。
热心网友
时间:2023-09-14 11:17
#ifndef
elemtype_h
#define
elemtype_h
的意思是,如果前面没有定义elemtype_h,那么现在定义elemtype_h
它不需要有值,只是表明是否被定义过,“指魔”说的很对,它是为了防止头文件的重复定义
我举个简单的例子帮助你理解:
你在a.h里定义了一个类a:
class
a{
}
然后在b.h里定义了一个类b,而且引用了a.h:
#include
"a.h"
class
b{
}
编译器在编译时,b.h的实际内容为:
class
a{
}
class
b{
}
这里还没出现错误。
然后你在c.cpp里引用了a.h和b.h:
#include
"a.h"
#include
"b.h"
那么,编译器在编译的时候会把a.h和b.h里的内容原封不动的填进来以代替这两句,这样c.cpp就变为:
class
a{
}
class
a{
}
class
b{
}
你可以很清楚的看到,类a重定义了。
那么,如果我们用到前面提到的宏定义来分别定义a.h和b.h如下:
//a.h
#ifndef
a_h
class
a{
}
#define
a_h
//b.h
#ifndef
b_h
class
b{
}
#define
b_h
那么,c.cpp展开后为:
#ifndef
a_h
class
a{
}
#define
a_h
#ifndef
a_h
class
a{
}
#define
a_h
可以看到,执行第一次class
a的定义时,由于宏a_h未定义,故此时执行类a的定义,并定义a_h,然后执行第二次class
a的定义时,发现a_h已经定义,因此跳过a的再次定义,避免了重定义
希望对你有所帮助!