C 声明包含多个值的宏并将其作为数组访问

C 声明包含多个值的宏并将其作为数组访问,c,C,我想创建一个包含多个值的宏,以便可以将它们作为数组进行访问,如下所示: #define Arr {1,2,3,4} int main(){ printf("%d ", Arr[0]) } 这是不工作,但我张贴在这里,看看是否有人能够修改它,以满足我的要求。我想不出其他解决办法。任何暗示都将不胜感激 提前感谢您。当正则变量可以执行以下操作时,不要使用宏: int Arr[] = { 1, 2, 3, 4 }; 您可以声明匿名数组的类型,这将允许您访问其元素: #define Arr

我想创建一个包含多个值的宏,以便可以将它们作为数组进行访问,如下所示:

#define Arr {1,2,3,4}

int main(){
    printf("%d ", Arr[0])
}
这是不工作,但我张贴在这里,看看是否有人能够修改它,以满足我的要求。我想不出其他解决办法。任何暗示都将不胜感激


提前感谢您。

当正则变量可以执行以下操作时,不要使用宏:

int Arr[] = { 1, 2, 3, 4 };

您可以声明匿名数组的类型,这将允许您访问其元素:

#define Arr ((int[]) { 1, 2, 3, 4 })

int main(){
  printf("%d ", Arr[0]); // prints "1 "
}
但是,在这里使用宏没有什么好处,因为静态常量变量除了比宏更灵活、更优化、更不容易出错之外,还做同样的事情:

static const int Arr[] = { 1, 2, 3, 4 };

int main(){
  printf("%d ", Arr[0]); // prints "1 "
}

你想去多低的级别

#define  ARG_MASK 0x0f
#define  ARG_FILE 0x01
#define  ARG_NAME 0x02
#define  ARG_AGE  0x04
#define  ARG_LAST 0x08

Arg = input_from_somewhere(stdin);
Value = Arg;
printf( "Arg values are: " );

if( Value & 1 ) {
    printf( "file " );
}
Value >>= 1;
if( Value & 1 ) {
    printf( "name " );
}
Value >>= 1;
if( Value & 1 ) {
    printf( "age " );
}
Value >>= 1;
if( Value & 1 ) {
    printf( "last" );
}
printf( "\nArg %x\n", Arg );

简单的解决方案,尽管我更喜欢在switch语句中进行这种类型的测试。在不了解更多信息的情况下,ifs工作得足够好。

使用字符串文字:

#define Arr "\1\2\3\4"

很简单,虽然它只适用于0..127的值,这些值是八进制的…

为什么它必须是一个宏?帮你自己一个忙,避免使用宏。它们很难调试。使用编译器insteeadHow about
static const int Arr={1,2,3,4}的强大功能?为什么它必须使用宏?这是一个XY问题。使用静态变量,而不是宏!我想只有一个正则变量可以。然后您仍然可以
#define MACROARR Arr
,您就完成了:)所述的问题是在#define中保存多个值。正如我所说的,你想要多低?因此,一个简单的位掩码在一个宏中,用一个简单的解决方案来提取值。现代CPU有64位,如果值是常量,那么位掩码就足够且有效。似乎是对一个稍微不同的问题的回答,因为定义了多个令牌,而不是使用一个宏。我将向上投票以抵消一些可能不公平的向下投票,尽管我怀疑op是否希望在数组上使用位掩码(但问题是无上下文的,所以…谁知道…)。所问的问题不正确,正如其他几个人所解释的。我只是提供了一个适当的C解决方案,适当的低级别,并运用了语言本身以及m4的优势。比特掩码和测试相同的是在C++中变得很重要的不是那么多。