【问题标题】:Concatenating qt-specific keyword and macro argument with a space in between将特定于 qt 的关键字和宏参数与它们之间的空格连接起来
【发布时间】:2011-03-26 20:16:42
【问题描述】:

我的问题很简单。我想要下面的宏

#define PROXYPASS(name, param) \
void MyClass::sl_name(param _param) { \
    emit name(_param); \
}

PROXYPASS(clientAdded, Client*) 扩展为:

void MyClass::sl_clientAdded(Client* _param) { \
    emit clientAdded(_param); \
}

但由于它不起作用,即它仍然只显示sl_name 而不是sl_clientAdded。所以,这就是我正在使用的:

#define PROXYPASS(name, param) \
void MyClass::sl_ ## name(param _param) { \
    emit ## name(_param); \
}

它工作正常,除了它扩展为:

void MyClass::sl_clientAdded(Client* _param) { \
    emitclientAdded(_param); \
}

除了emitclientAdded 之间没有空格之外,一切都很好,即它扩展为emitclientAdded 而不是emit clientAdded。那么我该怎么做呢?有没有办法添加空格,或者我必须寻找另一种方式。由于以下声明,很多谷歌搜索让我的希望落空:[gcc 预处理器]是否在标记之间放置空白是未定义的。

我的其他失败尝试包括

emit ## ## name(_param);
emit ## /* */ ## name(_param);
emit ## \ ## name(_param);
emit /* */ ## name(_param);
emit ## space ## name(_param); [#define space \ ]

非常感谢任何帮助。

注意:使用gcc -E myclass.cpp检查预处理器输出和宏扩展。

【问题讨论】:

    标签: c++ qt concatenation c-preprocessor


    【解决方案1】:

    什么都不放在那里,你不需要连接任何东西:

    #define PROXYPASS(name, param) \
    void MyClass::sl_ ## name(param _param) { \
        emit name(_param); \
    }
    

    【讨论】:

    • emit name(_param) 仅扩展为 clientAdded(_param);。出于某种奇怪的原因,emit 关键字被简单地吞噬了。我确实认为这是因为它不是标准的 C++,因为如果我将其更改为 int name(_param),它会正确扩展为 int clientAdded(_param);。我认为这是因为emit 本身就是一个宏。
    • 是的,确实如此。 emit“关键字”扩展为空,没有实际意义。 Qt 的信号行为类似,实际上是函数,并且可以在没有emit 的情况下调用。
    • 非常感谢。我想我一直在做需要做的事情:)
    猜你喜欢
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2023-01-24
    相关资源
    最近更新 更多