2010-02-24 46 views
2

我想不出字标题一个更好的办法...在这种情况下,我该如何强制C++宏替换?

#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有一些预处理器的东西,或者有一个简单的方法。想法?

+0

像make中的':='赋值。 – 2010-02-24 23:04:54

+0

你想用它来实现什么?如果您退后一步并解释您要解决的问题,我们可能会提出其他方法来解决问题。宏观替代不会奏效。 – jalf 2010-02-25 12:46:13

回答

3

不,使用标准预处理器无法做到这一点。

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

6

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

0

不,这是不可能的。

我自己使用了一些预处理编程,但我确实明白需要:例如对于BOOST_PP_FOR_EACH,您应该传递一个宏以在循环的每一个循环中被调用,然而这个宏只在本地有用,然后混乱符号表......可能导致名称冲突。

由于没有办法让undef它没有导致宏调用它不工作,一般的解决办法是给宏一个长而笨重的名字,这样你就不会冒着重用这个名字的风险稍后的。

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

PROJECT_PATH_FUNCTION 

例如,很BOOST_PP_FOR_EACH我说的是可以通过包括boost/preprocessor/for_each.hpp找到。

通过明确指出路径,您不仅可以帮助人们快速找到您的宏,还可以避免冲突,因为在文件内您可以快速检查您是否搞乱了。