关于#define后面#的使用

Chirive 2013-01-08 05:50:17

class BaseAbc
{
public:
BaseAbc(){std::cout<<"constructor"<<std::endl;}
};
void Base(const string &x,BaseAbc *b){}
#define ADD_PACK(name) Base(#name, new name##Abc);

ADD_PACK(Base);
int main()
{
system("pause");
return 0;
}

报错说'Base'被重定义了,之前的定义是函数。
这。。。。
...全文
423 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2013-01-09
  • 打赏
  • 举报
回复
楼主的1楼的程序里 ADD_PACK(Base); 预处理后的结果为 Base("Base", new BaseAbc);; 这是个函数调用,需要放到函数里啊。 楼主5楼的程序, ADD_PACK(Base); 预处理后是 static Abb BaseAbb("Base", new BaseAbc);; 这是个Abb类型的变量BaseAbb的初始化,调用Abb的构造函数 Abb(const std::string &x,BaseAbc *b) 查看预处理的结果可以用g++ -E file.cpp
Chirive 2013-01-08
  • 打赏
  • 举报
回复
版主!还没解决!
crazy_samba 2013-01-08
  • 打赏
  • 举报
回复
版主正解!函数调用应该放在函数或者main里面
东大坡居士 2013-01-08
  • 打赏
  • 举报
回复
因为原来你的是函数调用,但是执行的时候不会走到那, 后面的是函数声明
Chirive 2013-01-08
  • 打赏
  • 举报
回复
引用 3 楼 tianweishuiguo 的回复:
C++的话不是只有类吗? void Base(const string &x,BaseAbc *b){}//这是啥? 不是应该是类的成员函数吗? //接口的话,应该有interface吧 #define ADD_PACK(name) Base(#name, new name##Abc); ADD_PACK(Base); int main() /……
为什么一定要是成员函数?
Chirive 2013-01-08
  • 打赏
  • 举报
回复
引用 1 楼 mymtom 的回复:
ADD_PACK(Base)移到main函数里,还有啊 #define ADD_PACK(name) Base(#name, new name##Abc); 这个结尾的分号还是不要吧! C/C++ code?123456int main() { ADD_PACK(Base); system("pause"); return 0;} ……

class BaseAbc
{
public:
	BaseAbc(){std::cout<<"constructor"<<std::endl;}
};
class Abb
{
public:
	Abb(const std::string &x,BaseAbc *b)
{
	std::cout<<"ok"<<std::endl;
}
};
#define ADD_PACKAGE(name) static Abb name##Abb(#name, new name##Abc);
ADD_PACKAGE(Base);
int main() 
{
	system("pause");
	return 0;
}
谢谢,不过为什么这样写就可以呢,没把分号去掉,也没移到main里面
BeanJoy 2013-01-08
  • 打赏
  • 举报
回复
引用 2 楼 moshulxq 的回复:
#define ADD_PACK(name) Base(#name, new name##Abc); ADD_PACK(Base); 这个宏替换后是:Base(Base, new BaseAbc);; 确实你前面定义了函数void Base(const string &x,BaseAbc *b){} 不知你的ADD_PACK想要表达的是什么意思?? ……
宏中#表示扩展为字符串!
东大坡居士 2013-01-08
  • 打赏
  • 举报
回复
C++的话不是只有类吗? void Base(const string &x,BaseAbc *b){}//这是啥? 不是应该是类的成员函数吗? //接口的话,应该有interface吧 #define ADD_PACK(name) Base(#name, new name##Abc); ADD_PACK(Base); int main() //main也应该在类中吧 { system("pause"); return 0; }
moshulxq 2013-01-08
  • 打赏
  • 举报
回复
#define ADD_PACK(name) Base(#name, new name##Abc); ADD_PACK(Base); 这个宏替换后是:Base(Base, new BaseAbc);; 确实你前面定义了函数void Base(const string &x,BaseAbc *b){} 不知你的ADD_PACK想要表达的是什么意思??
mymtom 2013-01-08
  • 打赏
  • 举报
回复
ADD_PACK(Base)移到main函数里,还有啊 #define ADD_PACK(name) Base(#name, new name##Abc); 这个结尾的分号还是不要吧!

int main() 
{
    ADD_PACK(Base);
    system("pause");
    return 0;
}

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧