我想要一个宏来检测传递的参数是否被括号括起来,如果是的话就调用不同的宏。
例如
#define FOO(obj) BAR obj
#define BAR(...) func(__VA_ARGS__)
#define BAR
如果我用 调用它,FOO((1, 2, 3))
它会扩展为func(1, 2, 3)
。但如果我用 调用它,FOO(1)
它会扩展为1
我知道 C 中没有宏重载,但我想知道是否有其他方法可以实现此行为FOO
。我研究了几种宏技巧,但找不到方法来实现这一点。
我正在研究一个宏库并且需要这种精确的行为。
在这种情况下
FOO(1)
扩展为(1)
而不是1
,但这可能更可取。事实证明,这错误地接受了
FOO((1,2)3)
,将其扩展为bar(1,2 3)
。通过额外的宏观操作,您可以拒绝:我刚刚写了这个。这可以简化,这只是我在 godbolt 上得到的第一个有效的版本。应该足以让你开始。
这看起来好多了。转换
__VA_ARGS__
为逗号后,只需获取正确的参数位置即可。