【发布时间】:2016-08-02 04:49:49
【问题描述】:
我想修改传递给宏的名称以将其用作函数的名称。例如,我有一个名为 foo 的宏,如下所示:
#define foo(name) void name(const string& in) { \\do something }
但我希望使用像 foo(Bar::do) 这样的参数调用此宏,因此我必须将名称更改为正确的名称才能将其用作函数。
有什么方法可以实现吗?我使用 c++11 和 g++5.x。
编辑:
我遇到的问题是因为有一个旧版本的宏,它可以不受限制地使用,所以现在我的代码中有很多部分使用了诸如foo(Bar::do)之类的宏,但现在我必须使用这些名称生成函数但函数名称必须有区别,所以我决定使用宏输入参数作为函数名称,但遇到了我解释的问题。
这是一个例子:
void Bar::do(some_parameters)
{
FOO(Bar::do);
}
这是我之前的代码部分,现在我想在这部分上方添加第二个宏,如下所示:
FOO2(Bar::do)
void Bar::do(some_parameters)
{
FOO(Bar::do);
}
两个名称必须相同,但FOO2必须根据输入参数生成函数。
编辑2:
我在这里尝试更准确地解释问题。 之前,我有一个这样的宏:
#define FOO(name) \
some codes here
但现在我想要一个可以扩展如下的宏:
#define FOO2(name) void proper_fcn_name(name)(const string &name){ do the same thing here}
#define FOO(name) proper_fcn_name(name)(#name)
我可以这样使用:
FOO2(some_name)
void Bar::fcn()
{
FOO(some_name);
}
如果some_name 的格式为Bar::fcn,我希望proper_fcn_name 将其更改为例如Bar_fcn。最后我希望有这样的东西,如果some_name 是Bar::fcn:
void Bar_fcn(const stirng& name) { }
void Bar::fcn()
{
Bar_fcn("Bar::fcn");
}
我必须提到Bar::fcn 只是一个名称,但我必须考虑这一点,因为我的图书馆用户以前使用过这种风格。
【问题讨论】:
-
为什么要使用宏,而不是
std::function? -
看来你要使用宏定义而不是方法模板
-
您要解决的更大问题是什么?你为什么要这样做(不管这是什么)?
-
我相信他是在说他想要一个给定输入
namespace::member(其中命名空间可能是命名空间或类)的宏,它将能够输出一个有效的、唯一的函数名。例如。MYMACRO(A::b)可能会产生A_b_stub,但我不明白它是否还必须应对MYMACRO(x)和MYMACRO(ns::cls::mbr) -
所以更准确地说这不是'mangling',它只是在前面加上一个命名空间?
标签: c++ c++11 macros c-preprocessor