我已经为下面显示的set function编写了一个宏,并且正在使用raspberry pi
#define GPIO_SET(g) (*(gpio.addr + 7) |= (1<<(g)))
#define ALL_COL_HIGH (GPIO_SET(COL1) | GOIO_SET(COL2) | GPIO_SET(COL3) | GPIOO
_SET(COL4))
当我编译文件时,我会收到以下错误
**undefined reference to `GOIO_SET'**
我怎么能克服这个?
答案 0 :(得分:0)
您是否注意到您定义了GPIO_SET
,但之后使用了GOIO_SET
?第二个字母是不同的!定义中为P
,但使用中为O
。另外还有其他拼写错误:GPIOO_SET
有两个O
。
由于未定义GOIO_SET
名称,编译器认为它必须是函数或其他东西,但它没有定义,所以它会给你错误。
作为旁注,我认为你的代码是错误的。您的ALL_COL_HIGH
宏将扩展为:
(*(gpio.addr + 7) |= (1<<(COL1))) | (*(gpio.addr + 7) |= (1<<(COL2))) ...
这将在没有中间序列点的情况下多次修改相同的值(*(gpio.addr + 7)
),这是未定义的行为。
您可以使用逗号运算符解决此问题,因为|
中的ALL_COL_HIGH
毫无意义:
#define ALL_COL_HIGH (GPIO_SET(COL1) , GPIO_SET(COL2) , GPIO_SET(COL3) , GPIO_SET(COL4))
逗号运算符确实包含一个序列点,所以一切都会好的。
虽然通常更容易将COLx值定义为实际位并同时设置所有位。
#define COL1 (1<<1)
#define COL2 (1<<2)
#define COL3 (1<<3)
#define COL4 (1<<4) //or whatever
#define GPIO_SET(g) (*(gpio.addr + 7) |= (g))
#define ALL_COL_HIGH (GPIO_SET(COL1 | COL2 | COL3 | COL4))