2

我想不出更好的方式来表达标题...

#define X(c) c
#define Y(c) X(c)
#undef X

int main(int argc,char*argv[])
{
    std::cout << Y(5) << std::endl;
    return 0;
}

这会导致错误,因为 X() 未在此范围内声明。有没有办法让 Y 存储 X 的副本(又名,在我定义 Y 时强制进行宏替换),使其不再依赖于 X 存在?也许 boost 有一些预处理器的东西,或者也许有一个简单的方法。想法?

4

3 回答 3

6

C 预处理器进行暴力文本替换;它没有范围感,不能用于以这种方式创建闭包。

于 2010-02-24T23:12:58.480 回答
3

不,没有办法使用标准预处理器来做到这一点。

为什么在实际使用之前需要取消定义 X ?

于 2010-02-24T23:07:38.010 回答
0

不,这是不可能的。

虽然我自己使用了一些预处理编程,但我确实理解这种需求:例如,BOOST_PP_FOR_EACH您应该传递一个宏以在循环的每一轮中调用,但该宏仅在本地有用,然后会使您的符号表混乱.. . 可能导致名称冲突。

由于没有办法在undef不导致调用它的宏不起作用的情况下,一般的解决方案是给宏起一个长而笨重的名称,这样您以后就不会遇到重用这个名称的风险。

Boost 在这方面有一个非常有用的命名约定:

PROJECT_PATH_FUNCTION

例如,BOOST_PP_FOR_EACH我所说的非常可以通过包含boost/preprocessor/for_each.hpp.

通过明确说明路径,您不仅可以帮助人们快速找到您的宏,而且还可以避免冲突,因为在文件中您可以快速检查您没有搞砸。

于 2010-02-25T09:21:17.120 回答