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

#pragma内#define

  •  10
  • Donotalo  · 技术社区  · 14 年前

    我在一个微控制器里工作 C级 语言。在这个特定的micro中,必须使用 #pragma 按以下方式:

    static void func();
    #pragma INTERRUPT func <interrupt_address> <interrupt_category>
    static void func() { /* function body */ }
    

    这个 <interrupt_address> 是向量表中中断的地址。这个 <interrupt_category>

    static void _int_p00();
    #pragma INTERRUPT _int_p00 0x10 1
    static void _int_p00() { (*isr_p00)(); }
    

    isr_p00 在示例中)执行它们。

    如果可以用宏来定义中断,那就很方便了。我想按以下方式定义宏:

    #define DECLARE_INTERRUPT(INT_NAME, INT_CAT) \
        static void _int_##INT_NAME(); \
        #pragma INTERRUPT _int_##INT_NAME INT_NAME##_ADDR INT_CAT \
        static void _int_##INT_NAME() { (*isr_##INT_NAME)(); }
    

    Formal parameter missing after '#'
    

    表示以下行:

    static void _int_##INT_NAME() { (*isr_##INT_NAME)(); }
    

    我猜预处理器指令不能用于 #define 什么?附近有工作吗?

    3 回复  |  直到 9 年前
        1
  •  13
  •   Jens Gustedt    14 年前

    C99有新的 _Pragma 关键字,让您放置 #pragma 宏内部。基本上,它需要一个字符串作为一个参数,它对应于您将要提供给 #布拉格马 指令。

    如果您的编译器不支持这一点(gcc支持),那么您可以使用所需的外部实现(如前所述, m4 可能是一个选择)最好的办法可能是尽可能地靠近那些不太新鲜的东西 _布拉格马 . 一旦编译器生成器赶上了标准,就可以停止使用脚本了。

        2
  •  1
  •   mmmmmm    14 年前

    解决方法是使用代码生成或其他宏语言对代码进行预处理。

    用不同的扩展名写代码。

    然后编译它。

        3
  •  0
  •   detly    14 年前

    明确地 问是不可能的。我假设一个预处理器和 GNU C Preprocessor . 在手册里, it states

    编译器不会重新标记预处理器的输出。每个预处理令牌成为一个编译器令牌。