在不知道函数代码中其性质的情况下分配数组或整数(但编译器知道)

纪尧姆D

我正在寻找这样的片段。我希望它知道在编译时是否在处理数组,并避免以下错误。

#include <stdio.h>


#define IS_ARRAY(x,type) _Generic((&x),          \
                                 type (*)[]: 1,  \
                                 default:   0)

#define GENERIC_ASSIGN(arg,type) if(IS_ARRAY(arg,type)){arg[0] = 1; arg[1] = 2;}else{arg = 2;}

int main(void)
{

    int foo = 0;
    int bar[10] = {0};

    GENERIC_ASSIGN(bar,int); //-->  error: assignment to expression with array type
    GENERIC_ASSIGN(foo,int); //--> error: subscripted value is neither array nor pointer nor vector  "arg[0] = 1; arg[1] = 2;"

    return 0;
}

当我写GENERIC_ASSIGN(bar,int)的时候,我确实知道'bar'是一个数组,编译器也是如此。

请参阅此处解释问题一部分的本主题

如果在宏中允许使用“ #if”,该问题将很容易解决。

伦丁

您无法分配给数组,因此必须使用memcpy。例如,让宏创建所有初始化程序的复合文字,然后将其初始化。

#include <stdio.h>
#include <string.h>

#define IS_ARRAY(x,type) _Generic((&x),                             \
                                 type (*)[]: 1,                     \
                                 default:    0)

#define INIT(arg, type, ...) memcpy(&(arg),                         \
                                    (type[]){__VA_ARGS__},          \
                                    sizeof((type[]){__VA_ARGS__})) 

#define GENERIC_ASSIGN(arg,type) IS_ARRAY(arg,type) ?               \
                                 INIT(arg,type,1,2) :               \
                                 INIT(arg,type,2)

int main(void)
{
  int foo = 0;
  int bar[10] = {0};

  GENERIC_ASSIGN(bar,int);
  GENERIC_ASSIGN(foo,int);

  printf("%d %d\n",bar[0], bar[1]);
  printf("%d\n",foo);

  return 0;
}

值得注意的是,使用此方法实际上与使用什么类型(是否使用数组)无关紧要。初始化列表的大小很重要。

gcc -O2将其解析为几个寄存器加载(x86):

    mov     edx, 2
    mov     esi, 1
    xor     eax, eax
    mov     edi, OFFSET FLAT:.LC0
    call    printf
    mov     esi, 2
    mov     edi, OFFSET FLAT:.LC1
    xor     eax, eax
    call    printf

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

编译器如何在不知道编译时大小的情况下分配内存?

如何在编译器不知道的情况下更改变量的值?

C++ 在不知道其类型的情况下将数组传递给函数

在不知道返回类型的情况下,按其地址调用C ++中的函数

在不知道数组大小的情况下输入数组

我可以在不知道动态数组大小的情况下对其进行迭代

在不知道其尺寸的情况下切片数组

在不知道Main方法在哪里的情况下编译并执行Java源代码?

如何在不知道最初输入多少值的情况下将整数存储到数组中

如何在不知道其确切类型的情况下更新DbContext中的实体?

在不知道类型的情况下从文件中读取

在不知道键的情况下从数组中删除空数组元素

如何在不知道索引的情况下从numpy数组中删除对象

如何在不知道 C# 中的底层类型的情况下遍历数组

Swift 3:在不知道 indexPath 的情况下从数组中删除特定字符串?

如何在不知道索引的情况下替换 JavaScript 数组中的特定元素?

在事先不知道数字的情况下从数组中过滤共享相同数字的数字

在编译和处理ObjectDisposedException时不知道其System.Type的情况下打开新Form

动态分配-用户在运行时不知道数组大小的情况下输入元素

在不知道平均值的情况下计算一个整数数组的标准偏差

如何在不知道其在Visual Studio中的位置的情况下使用SqlDataReader从选择中获取值

如何在不知道其宽度的情况下将元素存储在2D向量中?

Firebase-在不知道其成员注册ID的情况下删除设备组

如何在不知道其长度的情况下遍历char **

在这种情况下,也不知道其任何超类

在不知道userdata实现的情况下,我可以在C ++中使用其字段吗?

Linux用户可以在不知道当前密码的情况下更改其密码吗?

如何在不知道通用数据结构类型的情况下获得其长度?

在不知道其类型EF的情况下查找具有唯一ID的实体