是否存在可以在不执行任何操作时使用的虚拟左值?

时间:2012-01-17 14:44:23

标签: 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;
    }
}

PORTdefine,例如:

#define PORT (P1OUT)

有没有办法重新定义PORT以便:

  • 它被接受为左值,
  • 该功能无效。

我想要做的是保持功能源不变,同时将其编译为什么都不做。

编辑:我知道使用这样的左值可能不是最佳解决方案。我不是在寻找这个特定问题的最佳解决方案,我对语言本身很感兴趣。这是一个理论问题,而不是务实的问题。

6 个答案:

答案 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。