【发布时间】:2013-08-11 01:50:54
【问题描述】:
我有这段代码(实际上是垃圾收集 Forth 系统的解释器的一部分):
#define PRIMITIVE(name) \
do \
{ \
VocabEntry* entry = (VocabEntry*)gc_alloc(sizeof(VocabEntry)); \
entry->code = name; \
entry->name = cstr_to_pstr(#name); \
entry->prev = latest_vocab_entry; \
latest_vocab_entry = entry; \
} \
while (false)
PRIMITIVE(dup);
PRIMITIVE(drop);
PRIMITIVE(swap);
// and a lot more
但是有一个问题:在行
entry->name = cstr_to_pstr(#name);
name 字段被替换为 dup、drop、swap 等。我希望字段名称不被替换。
那么,除了简单地重命名宏参数之外,还有什么办法可以解决这个问题?
如需回答,请说明在一般情况下是否有一种方法可以禁止在宏主体中替换宏参数名称。不要回答“就这样做”(请)。
【问题讨论】:
-
更改结构字段名称? (必须在这结束之前重命名一些东西,一种或另一种方式)。
-
@JimBalter 我只提供 n 替代方案,因为 OP 对潜在解决方案施加了限制。我不是第一次看到这种情况,尽管我同意重命名该论点是正确,但肯定不完全如此。当然,我也同意 OP 否决的答案不是好举措。
-
回到问题,既然预处理器正在做这一切,我并不羞于说我想不出办法“告诉”cpp它应该不 i> 替换它设计 所针对的事物的一个或多个实例。简而言之,可以更改宏参数的名称,也可以更改被替换为进攻的项目。注意:消除也是可能的,但高度不鼓励(即,您可以避开标准的边界,但仍留在其中,如果所讨论的结构字段是 第一个结构的成员。
-
@JimBalter 你真的希望我仅仅因为 你 认为你回答了我的问题而删除了我的反对票吗?你显然没有;否则我不会投反对票。
-
@WhozCraig 我对 Jim Balter 的回答投了反对票,因为它没有回答我的问题。没有其他原因。
标签: c c-preprocessor substitution