从宏参数中删除字符

时间:2016-07-16 21:01:33

标签: c++ macros

我试图创建一个宏来替换for循环

我希望它能像这样工作:

f(var, start, Eend)

其中var是循环变量的名称,start是开始和结束的值,它停止的值。 E是可以存在与否的符号。如果存在,则为=

我的宏实际上是这样的:

#define f(var, s, e) for(int var = s, kx = (s<e? 1 : -1); var != e; var += kx)

但是这个定义无法承受=,所以我想像这样扩展它:

f(i, 10, =15) cout<<" "<<i;
output: 10 11 12 13 14 15

我的问题是,是否可以删除宏的Eend参数的第一个字符。

我可以使用

发现它是否相等
#Eend[0] == '='

但在我不能使用Eend与s进行比较并找出我是否必须使用++或 -

这就是我想要的:

#define f(var, s, Eend) 

for(int var = s, kx = s<end? 1:-1, LIM = #Eend[0] == '='? end+kx : end; var!=end; var += kx)

其中end是Eend而没有&#39; =&#39; (如果存在)

1 个答案:

答案 0 :(得分:1)

对于你的宏问题,你可以简单地定义两个宏,稍微不同(希望是助记符)的名字。

例如,如果我理解正确的意图,

State

如果冗余不合适,那么你可以用第三个常见的实现宏来表达它们。

在没有宏的情况下执行此操作会更有效,但您只需要执行一次定义。

您可以避免宏的名称冲突。

E.g。它可以这样:

#define xf(var, s, e) for(int var = s, kx = (s<e? 1 : -1); var != e; var += kx)

#define f(var, s, e) for(int var = s, kx = (s<e? 1 : -1), e2 = e + kx; var != e2; var += kx)