代码之家  ›  专栏  ›  技术社区  ›  Engineer

C: 调用类方法而不显式传递“this”?

  •  1
  • Engineer  · 技术社区  · 10 年前

    我想知道预处理器逻辑/宏魔术是否可以像在典型的OO语言中那样在C(11)中实现,即。

    instance->method(a, b)
    

    instance.method(a, b)
    

    而不是

    method(instance, a, b) //instance is 'this'
    

    ?

    实际上,这只是一个排序问题,但我很想知道是否有人使用宏实现了类似的单词排序。我很喜欢不用通过考试的想法 this 作为客户端代码中每个方法调用的显式参数。这就是问题所在。

    3 回复  |  直到 10 年前
        1
  •  3
  •   unwind    10 年前

    使用GCC,可以创建如下宏:

    #define MCALL(obj, method, ...) do {\
        typeof(obj) this;\
        this->method(this, ## __VA_ARGS__);\
      } while(0)
    

    但这使用 typeof 其是GCC扩展。

    它不需要任何参数,因为它使用GCC扩展 ## 操作人员看见 this manual page 有关GCC如何实现可变宏的更多信息。

    当然,实际上这样做可能是个坏主意,因为你几乎在重新设计语言本身,从而使其他人更难理解。

        2
  •  3
  •   JBarberU    10 年前

    我完全可以看到做这样的事情只是为了好玩。但我会小心地在其他人使用或看到的任何代码中使用这种黑客手段。

    “总是编写代码,就好像维护代码的人是一个疯狂的连环杀手,知道你住在哪里”

    努力使用您正在使用的语言的惯例。

    所以要么坚持 someFunc(obj, param1, param2); 或者,如果可以,切换到支持所需功能的语言。

        3
  •  1
  •   TripeHound    10 年前

    如果您不想要“with params”和“no params”版本,并且不介意源代码中的括号不匹配,可以尝试:

    #define MCALL( object, method )  object->method( object
    

    并将其称为:

    MCALL( mything, setLength ), 57 ) ;
    length = MCALL( mything, getLength ) ) ;
    

    但这很难看。