Gau*_*ier 5 c embedded language-lawyer
考虑以下C99功能:
void port_pin_set(const bool value, const uint8_t pin_mask)
{
if (value) {
PORT |= pin_mask;
} else {
PORT &= ~pin_mask;
}
}
Run Code Online (Sandbox Code Playgroud)
以PORT
a define
为例,例如:
#define PORT (P1OUT)
Run Code Online (Sandbox Code Playgroud)
有没有办法重新定义,PORT
以便:
我想要做的是保持功能源不变,同时编译它不做任何事情.
编辑:我知道使用这样的左值可能不是最好的解决方案.我不是在寻找这个特定问题的最佳解决方案,我对语言本身很感兴趣.这是一个理论问题,而不是务实的问题.
Jen*_*edt 10
C99具有可用于此类任务的复合文字.它们的语法是一个强制转换后跟一个初始化器:
#define PORT ((int){0})
Run Code Online (Sandbox Code Playgroud)
应该在你的情况下这样做,只是你可能会得到一些关于未使用值的警告.
任何体面的编译器都会优化对这种复合文字的赋值.
您可以定义与您的P1OUT
(例如unsigned char
)相同类型的变量,使其在标题中可用,并在其中一个源中定义它,如下所示:
标题:
extern unsigned char dummy_P1OUT;
#define PORT (dummy_P1OUT)
Run Code Online (Sandbox Code Playgroud)
C档案:
unsigned char dummy_P1OUT;
Run Code Online (Sandbox Code Playgroud)
用途:
PORT &= ~pin_mask;
if (PORT & pin_mask) {
blink_led();
}
Run Code Online (Sandbox Code Playgroud)