#pragma在#define中

Don*_*alo 10 c microcontroller c-preprocessor

我正在使用C语言在微控制器中工作.在这个特定的微观中,必须使用#pragma以下方式定义中断:

static void func();
#pragma INTERRUPT func <interrupt_address> <interrupt_category>
static void func() { /* function body */ }
Run Code Online (Sandbox Code Playgroud)

<interrupt_address>是向量表的中断地址.的<interrupt_category>是1或2.例如,以限定在端口的中断0销0:

static void _int_p00();
#pragma INTERRUPT _int_p00 0x10 1
static void _int_p00() { (*isr_p00)(); }
Run Code Online (Sandbox Code Playgroud)

我们在别处定义实际的中断服务程序,并使用函数指针(如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)(); }
Run Code Online (Sandbox Code Playgroud)

编译器抛出以下错误:

Formal parameter missing after '#'
Run Code Online (Sandbox Code Playgroud)

指示以下行:

static void _int_##INT_NAME() { (*isr_##INT_NAME)(); }
Run Code Online (Sandbox Code Playgroud)

我想预处理器指令不能在#defines中使用?有什么工作吗?

Jen*_*edt 13

C99具有_Pragma允许您放置#pragma在宏内的新关键字.基本上它需要一个字符串作为参数,该参数对应于您将赋予该#pragma指令的文本.

如果你的编译器不支持这个(gcc没有)并且你需要外部实现你需要的东西(如上所述,m4可能是一个选择),那么最好的可能就是尽可能地保持不那么接近. - 新的_Pragma.然后,一旦您的编译器构建器赶上标准,您就可以停止使用您的脚本.