我想定义一个像
这样的宏#define AUTO_FUC(x) void x(){}
定义名为x的函数。
我认为函数名称将被arg x传递的x替换。
AUTO_FUC("test")//it should equal to void test(){} I think
但事实并非如此。
那么如何在C ++中实现呢?
我使用MinGW并使用不同的args两次使用宏。
AUTO_FUC("A")
AUTO_FUC("B")
它没有给我函数A()和B()。编译器告诉我void someClass::x() cannot be overloaded
。所以我知道宏不起作用。
谢谢,我意识到虚空“A”()不是正确的功能。我忘记了我将一个宏传递为arg而marco是一个字符串。
还有进一步的问题。我真正想要的是根据变量值创建一个名称函数。变量值可以像string a = a;
那样写吗?应该"
我是对的吗?因此,如果我使用类似"A"
的字符串,在将值传递给marco时,如何使用A
创建函数void A()
?
#include <string>
#include <iostream>
#define AUTO_FUC(x) \
void x() \
{\
std::cout<<"hi";\
}\
int main()
{
std::string A = "A";
AUTO_FUC(A); //it's equal to AUTO_FUC("A") it wrong
A(); //So it's undefined;
}
答案 0 :(得分:2)
[更新:您已编辑了问题,现在显示引用宏参数的代码。下次,在提出问题时尝试发布您的实际代码! ;-P]
您的代码运行正常...请在ideone.com运行here
#include <iostream>
#define AUTO_FUC(x) void x(){ std::cout << "hi!\n"; }
AUTO_FUC(test)
int main()
{
test();
}
标准输出
hi!
答案 1 :(得分:2)
问题是您没有传递A
和B
(标识符)。您正在传递"A"
和"B"
(字符串文字)。宏是文本替换。所以他们扩展到:
void "A"(){}
void "B"(){}
肯定你会同意这不是正确的C ++代码。将其更改为:
AUTO_FUC(A)
AUTO_FUC(B)