我正在尝试为库创建一组宏,以便为新用户简化嵌入式处理器(GNU编译器)上的数字I / O.以下是我到目前为止的情况:
[code]
#define 1 A4 // this is so that I can refer to I/O
#define 2 B5 // by reference number 1-55
// ****************************************************
// I/O #defines
// ****************************************************
#define OUTPUT(pin) JOIN(TRIS, pin) = 0
#define JOIN(a, b) (a ## b)
#define HIGH(pin) JOIN(R,pin) = 1
#define SWITCH3 1
#define LED3 2
OUTPUT(LED3);
HIGH(LED3);
[/code]
OUTPUT(LED3)应导致:(TRISA4)= 0; HIGH(LED3)应导致:(RA4)= 1;
但我得到的是:
(TRIS1)= 0; (R1)= 1;
谁能告诉我我做错了什么?
答案 0 :(得分:1)
让我们通过编译器运行它,看看它说的是什么:
$ gcc -E code.c
# 1 "code.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "code.c"
code.c:1:9: error: macro names must be identifiers
#define 1 A4 // this is so that I can refer to I/O
^
code.c:2:9: error: macro names must be identifiers
#define 2 B5 // by reference number 1-55
^
# 14 "code.c"
(TRIS2) = 0;
(R2) = 1;
我觉得这很清楚......
答案 1 :(得分:0)
在C(以及C ++)中,宏名称需要遵循标识符规则 - 这些都需要以字母字符(大写或小写无关紧要)或下划线开头。
即使允许,你的宏也会非常危险,因为任何单个站点号1(一个)都会被宏替换,如下所示:
for(int i = 1; i < n + 1; ++i)
此外,此名称信息量不大。 '1'可能意味着什么,一个数组的初始索引(如果之前的索引被保留用于任何其他目的),LPT1,...给你的宏正确,信息丰富的名称,以便任何人在你的代码中的任何地方读取它们得到一个提示它们实际上代表(这适用于所有标识符:变量,函数,宏,......)。在您的情况下,例如IO1
,DIGITAL_IO_1
,DIO1
,...(对于上面的索引示例:可以将其称为FIRST_OF_<some_functional_description>
或START_<description>
)。