关于C++宏定义问题
答案:6 悬赏:80 手机版
解决时间 2021-12-20 23:51
- 提问者网友:泪痣哥哥
- 2021-12-20 05:52
//问错了,不在C/C++分类里
#include
#include
#include
using namespace std;
void text() {
#define MACRO_
while ( MACRO_ != "Exit") {
#ifdef MACRO_
#undef MACRO_
#endif
#define MACRO_ << cin
MACRO_ MACRO_maxvalue = numeric_limits::max();
cout << "MACRO_maxvalue = " << MACRO_maxvalue << "\n";
MACRO_ MACRO_minvalue = numeric_limits::min();
cout << "MACRO_minvalue = " << MACRO_minvalue << "\n";
s = MACRO_
}
}
int main() {
text();
}
最佳答案
- 五星知识达人网友:野味小生
- 2021-12-20 06:48
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中的-号),则保留。这样就形成了置换的字符串。
全部回答
- 1楼网友:平生事
- 2021-12-20 12:12
#define MACRO_
这里定义了一个空的宏
while ( MACRO_ != "Exit") {
这里经过宏替换之后就会变成:
while ( != "Exit") {
显然会编译不通过。
你定义该宏的目的是什么?要实现什么机能?
#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的再次定义,避免了重定义 希望对你有所帮助!
- 3楼网友:不想翻身的咸鱼
- 2021-12-20 10:28
很简单
你先把完整的代码写出来
然后再把需要定义为宏的代码位置处做个标记 并把该代码删除
然后再定义你的宏 然后再把所有的标记换成你的宏明 就万无一失了
- 4楼网友:雪起风沙痕
- 2021-12-20 09:14
楼上的都说的挺好的
宏是用来定义常量的
比如: #define PI 3.14
- 5楼网友:笑迎怀羞
- 2021-12-20 07:56
#define MACRO_
改为#define MACRO_ "Exit"
下面这个地方真的让偶百思不得其解了
#define MACRO_ << cin
你到底要把MACRO_定义为什么东东啊,如果把MACRO_定义为int这样的内置类型,则中间的一堆语句可以解释,那么s=MACRO_又何解?如果想把MACRO定义为一个常量,那么s=MACRO_以上的语句又何解啊。真是高人啊
那这样改就行了
#define MACRO_ << cin
改为
#define MACRO_ cin>>
下面一句也要改
MACRO_ MACRO_maxvalue = numeric_limits::max();
需要改为两条语句,如下
MACRO_maxvalue = numeric_limits::max();
MACRO_ MACRO_maxvalue; //注意MACRO_后面有一个空格
同理
MACRO_ MACRO_minvalue = numeric_limits::min();
也要改为两条语句
MACRO_minvalue = numeric_limits::min();
MACRO_ MACRO_minvalue ;
彼人对你的MACRO_minvalue = numeric_limits::min();这条语句还是不够理解,如果这条语句表示使用=后面的东东去初始化MACRO_minvalue的话,则上面的修改方示就没有错。如果是其他用途,那就不好整了
记住一条简单规则就行:#define是简单的替换,比如
#define MACRO_ cin>>
那么语句MACRO_ MACRO_minvalue ;会被替换为
cin>> MACRO_minvalue;
因此其意思就是输入MACRO_minvalue的值。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯