GCC C语言处理主要函数之c_register_pragma

c_register_pragma:

/* Register a C pragma handler, using a space and a name.  It disallows pragma    expansion (if you want it, use c_register_pragma_with_expansion instead).  */ void c_register_pragma (const char *space, const char *name,                    pragma_handler_1arg handler) {   internal_pragma_handler ihandler;

  ihandler.handler.handler_1arg = handler;   ihandler.extra_data = false;   ihandler.data = NULL;   c_register_pragma_1 (space, name, ihandler, false); }

 

/* Front-end wrappers for pragma registration.  */ typedef void (*pragma_handler_1arg)(struct cpp_reader *); /* A second pragma handler, which adds a void * argument allowing to pass extra    data to the handler.  */ typedef void (*pragma_handler_2arg)(struct cpp_reader *, void *);

/* This union allows to abstract the different handlers.  */ union gen_pragma_handler {   pragma_handler_1arg handler_1arg;   pragma_handler_2arg handler_2arg; }; /* Internally used to keep the data of the handler.  */ struct internal_pragma_handler {   union gen_pragma_handler handler;   /* Permits to know if handler is a pragma_handler_1arg (extra_data is false)      or a pragma_handler_2arg (extra_data is true).  */   bool extra_data;   /* A data field which can be used when extra_data is true.  */   void * data; };

 

 

/* Front-end wrappers for pragma registration to avoid dragging    cpplib.h in almost everywhere.  */

static void c_register_pragma_1 (const char *space, const char *name,                      internal_pragma_handler ihandler, bool allow_expansion) {   unsigned id;

  if (flag_preprocess_only)     {       pragma_ns_name ns_name;

      if (!allow_expansion)  return;

      ns_name.space = space;       ns_name.name = name;       registered_pp_pragmas.safe_push (ns_name);       id = registered_pp_pragmas.length ();       id += PRAGMA_FIRST_EXTERNAL - 1;     }   else     {       registered_pragmas.safe_push (ihandler);       id = registered_pragmas.length ();       id += PRAGMA_FIRST_EXTERNAL - 1;

      /* The C front end allocates 8 bits in c_token.  The C++ front end   keeps the pragma kind in the form of INTEGER_CST, so no small   limit applies.  At present this is sufficient.  */       gcc_assert (id < 256);     }

  cpp_register_deferred_pragma (parse_in, space, name, id,     allow_expansion, false); }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值