【问题标题】:Overloaded operators in C via macros with type notification通过带有类型通知的宏在 C 中重载运算符
【发布时间】:2014-06-21 12:31:10
【问题描述】:

C 预处理器不能用于重载运算符,因为它不知道表达式“a+b”中 a 和 b 的类型,请参阅this question

但是,给它一个类型怎么样,像这样:

out = (a*b+b*n) x c : {a,b,c->vector3, n->float};

将被预处理为:

vector3 out = cross(add(dot(a,b), mult(b,n)),c);

这个解决方法,在将代码库迁移到 C++ 或连接 C 和 C++ 时很有用,不值得麻烦,同样冗长。但是, : 左边的表达式更容易阅读。

这样的解决方案可行吗?

【问题讨论】:

  • 这将被预处理......通过什么?
  • 一些宏,希望不会太难写。
  • 我真的很怀疑除了实验/代码混淆区域之外的某个地方会接受这样的事情。想想调试这样的东西头疼 - 矫枉过正
  • 瞄准自制的半生不熟的宏处理器,还是瞄准像 C++ 这样的真实语言?这是一个艰难的困境......
  • @n.m:你这里没有发明的权利是一种常见病。但是在我的例子中,C++ 带来了可移植性问题。不,我不会尝试任何花哨的元编程,只需使用详细的方式就可以了。这让我更了解宏的能力。

标签: c macros operator-overloading


【解决方案1】:

这对于 C 预处理器是不可能的,我可以通过简单地列出所有预处理器指令来证明它

  • #include(复制粘贴文件内容)
  • #define(宏)
  • #if#else#elif#ifdef#ifndef(条件编译)
  • #line(改变__LINE____FILE__的值)
  • #error(强制编译错误)
  • #pragma(依赖于编译器的功能)
  • #(空指令,什么都不做)

您感兴趣的一个功能,宏,仅适用于标识符:

#define MAX(a,b) replacement
#define VALUE replacement

+*:{} 不是标识符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多