【发布时间】:2019-07-03 12:01:56
【问题描述】:
以下代码取自LPC54618.h头文件:
typedef struct {
//...structure elements
__IO uint32_t SDIOCLKSEL;
//...more elements
} SYSCON_Type;
#define SYSCON_BASE (0x40000000u)
#define SYSCON ((SYSCON_Type *)SYSCON_BASE)
-
据我所知,这句话背后的意思
#define SYSCON ((SYSCON_Type *)SYSCON_BASE)
我假设它创建了一个名为SYSCON 的指针,该指针指向一个类型为SYSCON_Type 的变量,该变量存储在地址0x40000000u 中。这真的会发生吗?是否有任何资源可以解释这里使用的语法(即在宏中定义指针)?
-
当我尝试直接更改 SDIOCLKSEL 的值时,即:
SYSCON->SDIOCLKSEL = some value;我收到一个错误:
error: expected ')' error: expected parameter declarator error: expected ')' error: expected function body after function declarator
但如果我在函数中使用它,例如:
void foo(void)
{
SYSCON->SDIOCLKSEL = some value;
}
没有错误。这是为什么?为什么我不能直接写入结构?
任何答案将不胜感激!
【问题讨论】:
-
您需要显示在上下文中无法编译的代码。一行代码本身并不能告诉我们任何事情。
-
您不能在函数之外使用通用语句。任何书籍、教程或课程都应该教过你。
-
就预处理器而言,
#define表示SYSCON现在是一个扩展为((SYSCON_Type *)0x40000000u)的常量,所以写SYSCON->SDIOCLKSEL = some value;完全等同于写((SYSCON_Type *)0x40000000u)->SDIOCLKSEL = some value;。其余的只是 C 语法,与预处理器无关。 -
请记住,您也可以让编译器向您显示预处理器的输出,以帮助了解正在发生的事情。检查编译器的文档以了解如何执行此操作。
-
预处理器对指针一无所知。因此,宏中没有指针定义的语法。它与没有宏的语法相同。
标签: c pointers c-preprocessor lpc