论坛首页 编程语言技术论坛

C 的 attr_accessor

浏览 1443 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-03   最后修改:2009-06-03
C
关于 macros:

  • # 将参数变成带引号的字符串
  • ## 连接两个 literal
  • 相邻的两个字符串会在编译期自动连接。如 "a" "bc" 相当于 "abc"。



#define attr_accessor(klass, attr) \
	rb_define_method(klass, #attr, RUBY_METHOD_FUNC(attr), 0);\
	rb_define_method(klass, (#attr"="), RUBY_METHOD_FUNC(attr##_eq), 1);



attr_accessor(S1, name);


会被展开成
rb_define_method(S1, "name", RUBY_METHOD_FUNC(name), 0);
rb_define_method(S1, "name=", RUBY_METHOD_FUNC(name_eq), 1);


变长度 attr_accessor 呢? C 的 macro 没法做递归,所以得用另一门语言做预处理…… 如 ruby。
个数到 16 个应该足够了……
File.open 'attr_accessors.h', 'w' do |f|
  f.puts <<-ES
    #define attr_accessor(ty, a) \
      private:\
        ty a;\
      public:\
        void set##a(ty a) {this->a = a;}\
        ty   get##a(void) {return this->a;}
  ES
  params = []
  mname = '#define attr_accessor%d(ty, %s) \\'
  mline = 'attr_accessor(ty, %s)'
  (2..16).each do |i|
    params << "a#{i}"
    f.puts (mname % [i, params.join(',')])
    f.puts (params.map{|e| mline % e}.join "\\\n")
  end
end

#include "attr_accessors.h"
class Dragon {
  attr_accessor4(int, hp, mp, exp, attack)
};


ruby MRI 用了很多类似这样的东西…… 先编译出一个 miniruby.exe,然后用 miniruby 做代码生成,再编译。
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics