C++ 获得;错误:“28:表达式必须具有常量值”;在使用可变宏时

C++ 获得;错误:“28:表达式必须具有常量值”;在使用可变宏时,c++,c,macros,C++,C,Macros,我正在做硬件编程。我在下面创建了Varidic宏 #define UPDATE_DATA(bit,...) { \ do { \ int i; \ int j = 0; \ int _args[] = {__VA_ARGS__};\ int *addr = (int *) ADDR ; \ for (i = 0; i < (sizeof(_args)/sizeof(_args[0])); i++) {\ *(int *) (DATA_ADDR - j) |= _args[i];\

我正在做硬件编程。我在下面创建了Varidic宏

#define UPDATE_DATA(bit,...) {  \
do { \
int i; \
int j = 0; \
int _args[] = {__VA_ARGS__};\
int *addr = (int *) ADDR ; \
for (i = 0; i < (sizeof(_args)/sizeof(_args[0])); i++) {\
 *(int *) (DATA_ADDR - j) |= _args[i];\
  j = j + 0x4; \
}\
*addr |= 1 << bit;\
 }while (0); \
}
我越来越
错误:#28:表达式必须具有常量值
记录器更新数据(msg_id,l_数据,(SRAM0_系统_基础_添加6+偏移量))


我不明白我做错了什么

我的建议是不要使用可变宏。它们扩展了代码大小,使维护变得困难

假设不需要将-1作为值传递,可以使用stdarg.h

#include <stdio.h>  // for test output, not actually needed when you do the I/O
#include <stdarg.h>

#define LOGGER  ((volatile int *)0x1234)
#define LOGGER_DATA ((volatile int *)0x5678)

void sendToLoggerV(int bit, va_list ap)
{
    int i, value;

    for (i = 0; ; ++i)
    {
        // do your write here...

        value = va_arg(ap, int);
        if (value == -1)
            break;

        // Can't really write it in this test, but this is what you would do:
        //LOGGER_DATA[-i] = value;

        printf("Pretending to write %d to %p\n", value, (void*)&LOGGER_DATA[-i]);
    }
    //*LOGGER |= 1 << bit;
    printf("Pretending to OR %d to %p\n", 1<<bit, (void*)LOGGER);
}

void sendToLogger(int bit, ...)
{
    va_list ap;
    va_start(ap,bit);
    sendToLoggerV(bit, ap);
    va_end(ap);
}

#define SEND_TO(bit, ...) sendToLogger(bit, __VA_ARGS__, -1)

int main()
{
    SEND_TO(1, 16, 17, 18, 19);
    SEND_TO(2, 30, 31);
}

我在这里做错了
int\u args[]={{uuuu VA\u args}在旧C中@BLUEPIXY没有理解您的意思?在C99中,初始值设定项可能不是常量。@BLUEPIXY那么有什么方法可以解决这个问题吗?或者任何其他方法来完成事情?使用新的编译器,如gcc和clang。你好,doug再次需要你的帮助…我知道已经很久了…我试图在聊天室联系你,我们讨论了这个问题,但那个聊天室似乎是forzen…等待你的回复!!!
#include <stdio.h>  // for test output, not actually needed when you do the I/O
#include <stdarg.h>

#define LOGGER  ((volatile int *)0x1234)
#define LOGGER_DATA ((volatile int *)0x5678)

void sendToLoggerV(int bit, va_list ap)
{
    int i, value;

    for (i = 0; ; ++i)
    {
        // do your write here...

        value = va_arg(ap, int);
        if (value == -1)
            break;

        // Can't really write it in this test, but this is what you would do:
        //LOGGER_DATA[-i] = value;

        printf("Pretending to write %d to %p\n", value, (void*)&LOGGER_DATA[-i]);
    }
    //*LOGGER |= 1 << bit;
    printf("Pretending to OR %d to %p\n", 1<<bit, (void*)LOGGER);
}

void sendToLogger(int bit, ...)
{
    va_list ap;
    va_start(ap,bit);
    sendToLoggerV(bit, ap);
    va_end(ap);
}

#define SEND_TO(bit, ...) sendToLogger(bit, __VA_ARGS__, -1)

int main()
{
    SEND_TO(1, 16, 17, 18, 19);
    SEND_TO(2, 30, 31);
}
Pretending to write 16 to 0x5678
Pretending to write 17 to 0x5674
Pretending to write 18 to 0x5670
Pretending to write 19 to 0x566c
Pretending to OR 2 to 0x1234
Pretending to write 30 to 0x5678
Pretending to write 31 to 0x5674
Pretending to OR 4 to 0x1234