【问题标题】:Merge type of variable with token将变量类型与标记合并
【发布时间】:2013-06-29 14:23:15
【问题描述】:

我想要一个宏,它可以将变量的类型与另一个标记合并以创建一个新标记。一个随机的例子:

int var;
int make_token(var);

这将变成:

int var;
int var_int;

我试图像这样定义宏:

#define make_token(x) x ## _ ## typeof(x)

但整个事情被扩展为:

int var;
int var_typeof(var)

有没有办法不用在宏的参数中传递变量的类型就可以做到这一点?

【问题讨论】:

  • 我不这么认为。预处理器对语言本身几乎一无所知。
  • 我相信你可以用双宏来做到这一点。 #define type_macro(x) typeof(x)#define make_token(x) x ## _ ## type_macro(x)。试试吧,但不要相信我的话,它有效。
  • 我发现“令牌”一词令人困惑,并且更喜欢“标识符”。
  • @SergeyL。已经试过了,但结果是一样的。

标签: c gcc macros c-preprocessor typeof


【解决方案1】:

由于typeof是在编译后期确定的,经过预处理,这是不可能的。

同样typeof 不会扩展为类型标识符;它不适用于文本/代码级别,而是在语义级别。它是编译器解释并用于确定其内部数据结构类型的关键字。

您唯一能做的就是将类型添加到宏中:​​

#define TYPED_VARIABLE(type, identifier) type identifier ## _ ## type

然而,正如一位智者最近所说:“使用匈牙利符号是无脑的,是一个巨大的错误,所以不要这样做!”我完全同意。

【讨论】:

  • +1 表示正确的想法。不过,您使用的词汇令人不安。预处理器根据定义(实际上对于大多数编译器而言)只是编译期间的一个阶段,而不是“编译前”运行。
  • 如果您可以添加“但是使用匈牙利符号是无脑的并且是一个巨大的错误,所以不要这样做”,我会赞成这个。
  • @meaning-matters,c 标准区分不同的“翻译阶段”,第 5.1.1.2 节,预处理是阶段 1 到 6。现代编译器一次性完成这些阶段,以便他们能够跟踪宏替换回源,所以所有这些都是“编译时”。如果你的意思是语义解释的一个阶段,那就这么说吧,它是 C 标准中的第 7 阶段。
  • @H2CO3 先生,你去吧 :-) 请立即投票。反正我一直讨厌匈牙利风格。
  • @meaning-matters 谢谢。接受我的 +1。
【解决方案2】:

对于要定义的每种类型,您都需要一个宏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多