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

纪尧姆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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何在不知道其长度的情况下从文件中读取2D数组?

来自分类Dev

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

来自分类Dev

在不知道类名的情况下创建函数

来自分类Dev

在不知道大小的情况下打印数组

来自分类Dev

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

来自分类Dev

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

来自分类Dev

尝试构建Java字节码的反编译器,并且不知道在什么情况下“堆栈映射框架”不会碰巧是“ FRAMSAME”

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

在不知道其结构的情况下显示React组件

来自分类Dev

是否可以在不知道其ID的情况下更新FaunaDB文档?

来自分类Dev

我如何在不知道图像ID的情况下更改其属性?

来自分类Dev

在不知道其命名空间的情况下卸载JavaScript库

来自分类Dev

在不知道其ID的情况下将焦点设置为动态创建的输入字段

来自分类Dev

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

来自分类Dev

使用jQuery在不知道其完整ID的情况下更改给定元素的属性

来自分类Dev

在不知道其范围的情况下阅读电子表格

来自分类Dev

如何在不知道 JavaScript 中的 id/class/tag 的情况下分配给 HTML 元素?

来自分类Dev

Intellij Typescript 编译器不知道 TResult 类型

来自分类Dev

如何在不知道类型的情况下从泛型函数调用函数?

来自分类Dev

如何在不知道原始数组大小的情况下增加动态数组(C ++)的大小?

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

    如何在不知道其长度的情况下从文件中读取2D数组?

  5. 5

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

  6. 6

    在不知道类名的情况下创建函数

  7. 7

    在不知道大小的情况下打印数组

  8. 8

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

  9. 9

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

  10. 10

    尝试构建Java字节码的反编译器,并且不知道在什么情况下“堆栈映射框架”不会碰巧是“ FRAMSAME”

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

    在不知道其结构的情况下显示React组件

  19. 19

    是否可以在不知道其ID的情况下更新FaunaDB文档?

  20. 20

    我如何在不知道图像ID的情况下更改其属性?

  21. 21

    在不知道其命名空间的情况下卸载JavaScript库

  22. 22

    在不知道其ID的情况下将焦点设置为动态创建的输入字段

  23. 23

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

  24. 24

    使用jQuery在不知道其完整ID的情况下更改给定元素的属性

  25. 25

    在不知道其范围的情况下阅读电子表格

  26. 26

    如何在不知道 JavaScript 中的 id/class/tag 的情况下分配给 HTML 元素?

  27. 27

    Intellij Typescript 编译器不知道 TResult 类型

  28. 28

    如何在不知道类型的情况下从泛型函数调用函数?

  29. 29

    如何在不知道原始数组大小的情况下增加动态数组(C ++)的大小?

热门标签

归档