考虑以下C99功能:
void port_pin_set(const bool value, const uint8_t pin_mask)
{
if (value) {
PORT |= pin_mask;
} else {
PORT &= ~pin_mask;
}
}
PORT
为define
,例如:
#define PORT (P1OUT)
有没有办法重新定义PORT
以便:
我想要做的是保持功能源不变,同时将其编译为什么都不做。
编辑:我知道使用这样的左值可能不是最佳解决方案。我不是在寻找这个特定问题的最佳解决方案,我对语言本身很感兴趣。这是一个理论问题,而不是务实的问题。
答案 0 :(得分:10)
C99具有可用于此类任务的复合文字。他们的语法是一个强制转换后跟一个初始化器:
#define PORT ((int){0})
应该在您的情况下执行,只是您可能会收到有关未使用值的警告。
任何体面的编译器都会优化对这种复合文字的赋值。
答案 1 :(得分:8)
您可以定义与P1OUT
相同类型的变量(例如,unsigned char
),使其在标题中可用,并在其中一个来源中定义,如下所示:
部首:
extern unsigned char dummy_P1OUT;
#define PORT (dummy_P1OUT)
C档案:
unsigned char dummy_P1OUT;
用途:
PORT &= ~pin_mask;
if (PORT & pin_mask) {
blink_led();
}
答案 2 :(得分:2)
这应该在C99中进行:
#ifdef PORT
#undef PORT
#endif
#define PORT int x = 0; x
适用于您的情况。但我建议您将整个代码放在#ifdef
之间,而不是重新定义PORT
:
void port_pin_set(const bool value, const uint8_t pin_mask)
{
#ifdef BUILD_PORT_PIN_SET
if (value) {
PORT |= pin_mask;
} else {
PORT &= ~pin_mask;
}
#endif
}
答案 3 :(得分:1)
不是直接lvalue
,但我希望它能满足您的目的。尝试
#define PORT if (0) P1OUT
它应该有效地使整个语句无效。你可能会得到一些警告,但这应该是可以克服的恕我直言。
答案 4 :(得分:0)
C ++中的变态可能会起到作用。例如,您可以定义PORT
以按值返回一个对象,该实现|=
和&=
运算符。
在CI中可以通过以下方式找出方法:如果函数在开头定义一个整数变量,那么PORT
可以定义为此变量或相关的变量P1OUT
in你的情况)。
当PORT
定义为局部变量时 - 您可能希望编译器省略此代码:为局部变量分配未使用的值。
答案 5 :(得分:0)
我在ubuntu上测试了下面的语句,它没有写入环境变量PATH的第一个字符,它在Windows上的位置。但是根据定义,它确实会导致未定义的行为。
#define PORT (*(uint8_t*)(getenv("PATH")))
因此,为了使其安全,可以在程序的其他地方定义虚拟环境值,并继续设置它。
#include <stdlib.h>
#ifdef PORT
#undef PORT
#endif
#define SETDUMMYPORT (putenv("dummyPORT=x"))
#define PORT (*(uint8_t*)(getenv("dummyPORT")))
程序中的某处设置虚拟环境变量:
int main(int argc, char* argv[])
{
SETDUMMYPORT;
}
然后可以像你的问题那样使用PORT。