8

我有许多变量的名称与工程规范文档中的元素相同,因此名称的字符串版本也很有用。

我发现自己经常使用这样的宏:

#define MACRO(a) a, #a

典型用法是:

void someFunction(int a, const char *name);

someFunction(MACRO(meaningfully_named_variable));

我的问题有三个:

  • 有没有更好的方法来做到这一点?
  • Boost 或其他库中是否有类似的宏?
  • 如果没有,我该如何改进和重命名它以使其清晰有用?

编辑 我应该说上面是一个最小的例子。该函数可能有其他参数,命名实体可能是数据成员,甚至可能是函数本身。

我正在为 C++ 考虑的另一个扩展是一个NamedRef可以接收宏内容的类。

template <typename T>
struct NamedRef
{
    NamedRef(T *t, const char *name) : t(t), name(name) { }
    T *t;
    const char *name;
};

template <typename T>
NamedRef<T> namedRef(T &t, const char *name)
{
    return NamedRef<T>(&t, name);
}

#define WITH_NAME(a) a, #a

// more sophisticated usage example
void otherFunction(double, NamedRef<int>, bool);

otherFunction(0.0, namedRef(object.WITH_NAME(meaningful_member_name)), false);
4

4 回答 4

5

你可以更进一步:

#define SOMEFUNCTION(a) somefunction(a, #a)

但是,这仅在您多次调用相同的函数时才有用。否则,我认为没有比您的示例更好的方法了。当然,您应该将宏的名称更改为更有意义的名称,例如之类的ARGUMENTS

于 2011-12-21T23:33:24.170 回答
0
#define someFunction(a)  if (1) stringized_someFunction((a), #a ); else (void)0
void stringized_someFunction(int a, const char* name);

if (1) 东西包裹了宏,这样它就不会(通常)与循环、分支、if 语句等混淆。

然后你会像这样调用你的函数:

int r = 4;
someFunction(r);

您实际上只为每个“函数声明”添加了一行。如果 C 预处理器允许多个步骤,您可以将它们全部打包成一个,但可惜它没有。

我忘记了,因为我希望很明显你需要编写你的函数:

void stringized_someFunction(int a, const char* name)
{
  // Do stuff here
}

无论如何,以这种方式阅读应该更容易,更漂亮。

于 2011-12-22T00:06:56.147 回答
0

您可能会发现XMACRO对此类工作很有用。

于 2011-12-22T00:12:02.463 回答
0

正如杰西回答的那样,

你可以这样写:

void function1(int a, const char* name)
{
    cout << "a: " << a << endl;
    cout << "name: " << name << endl;
}

void function2(double d, const char* name, const char *str)
{
    cout << "d: " << d << endl;
    cout << "name: " << name << endl;
    cout << "str: " << str << endl;
}

#define MACRO(functionName, a) functionName(a, #a)
#define MACRO2(functionName, a, ...) functionName(a, #a, __VA_ARGS__)

int main()
{
    int a = 10;
    MACRO(function1, a);
    double d = 10.5;
    MACRO2(function2, d, "Hello world");
    return 0;
}

如果您有更多参数要传递,则可以使用使用可变参数的 MACRO2。您必须相应地传递函数名称。

于 2011-12-22T09:18:28.977 回答