#pragma在#define中

时间:2010-07-27 05:20:49

标签: c c-preprocessor microcontroller

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

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

<interrupt_address>是向量表中的中断地址。 <interrupt_category>为1或2.例如,要在端口0引脚0中定义中断:

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 个答案:

答案 0 :(得分:12)

C99有一个新的_Pragma关键字,可让您将#pragma置于宏中。基本上它需要一个字符串作为参数,该参数对应于您将赋予#pragma指令的文本。

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

答案 1 :(得分:1)

workround是使用代码生成或其他宏语言来预处理代码。

即用不同的扩展名编写代码。

让您的makefile或类似函数调用宏语言(例如m4)或某种形式的脚本来生成.c文件

然后编译。

答案 2 :(得分:0)

据我所知,你特别提出的问题是不可能的。我假设一个预处理器与GNU C Preprocessor的工作方式相同。在手册中,it states

  

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