【问题标题】:Prefixing function calls with macros使用宏为函数调用添加前缀
【发布时间】:2013-06-25 14:14:05
【问题描述】:

我遇到了一个问题,我需要能够通过宏修改 C 函数调用。

基本结构是这样的:

#define foo bar
foo_1(x);
foo_2(x);
foo_3(x);

我想要的是为了

bar_1(x);
bar_2(x);
bar_3(x);

要被调用,但是字符串宏似乎没有替换调用的前缀部分。

有人能指出正确的方向吗?

【问题讨论】:

  • 好吧,预处理器在标记上工作,而不是文本片段。 foo_1 是单个令牌。
  • 这就解释了!在那种例子中认为这是一个查找/替换。谢谢。

标签: c macros


【解决方案1】:

宏只适用于完整的令牌(感谢上帝——它们已经够糟糕了)。换句话说,#define foo bar 只影响标识的foo,而不影响标识符foo_1,因为这不是同一个令牌。

如果不能修改调用代码,就没有办法实现你想要的。使用文本编辑器的搜索和替换或类似的东西。

如果你真正想要的是一个函数调用代码的sn-p,你可以根据需要调整为不同的名称前缀,你可以这样写:

foo(1)(x);
foo(2)(x);
foo(3)(x);

在你包含这个 sn-p 之前,你定义了这样的东西:

#define foo(i) bar_ ## i

【讨论】:

  • 谢谢,这正是我所担心的 :) 希望通过这种解决方案节省一些时间,看起来我会跳到最后的正确实施。
  • 根据我的经验,做预处理器技巧永远不会节省时间。
【解决方案2】:

使用string concatenation:

➤ cat try.h
#define mymacro(msv) bar_##msv
mymacro(1)(x);
➤ gcc -E try.h
# 1 "try.h"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "try.h"

bar_1(x);

【讨论】:

  • 正要指出旧代码无效,但您已修复。
  • 谢谢,但是代码太广泛了,无法用这样的调用来包装所有内容。希望这将是一个快速解决方案,看起来我将直接跳到 fina 解决方案。
猜你喜欢
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 2017-10-26
相关资源
最近更新 更多