【问题标题】:pointer to anonymous struct array in c指向c中的匿名结构数组的指针
【发布时间】:2018-08-24 14:34:10
【问题描述】:

所以我有一个这样声明的数组(这不是我的代码,我不会修改它):

static const struct {
    int gsmesc;
    int latin1;
    int utf8_int;
    char *utf8;
    ...

} gsm_escapes[] = {
    {  10, 12 , 0x0C, "\x0C" },
    {  20, '^', 0x5E, "\x5E" }, 
    ...
};

请注意,结构本身是未标记的

我想用一个指针(而不是数组下标)迭代这个数组,我能想到的最好的就是这个,它编译时没有任何警告:

typeof(*gsm_escapes) *esc;
...

esc = gsm_escapes;
while (esc++->gsmesc != -1) {

    esc = gsm_escapes;
    while (esc->gsmesc != -1) {

是否有一种“正确”的方式来声明这种指针类型,因为这种方式似乎一反常态地不优雅?

这种类型的数据结构甚至被称为什么?我已经在谷歌上搜索了很长时间,但还没有找到任何涵盖它的引物。

【问题讨论】:

  • typeof 似乎完全合法。
  • 你可以改用typeof(*gsm_escapes),我想……但是你为什么不能直接迭代gsm_escapes呢?
  • 我想用一个指针迭代这个数组 为什么?这实际上只是在做编译器很乐意为你做的显式指针数学。
  • 我猜typeof 是合法的,当且仅当它做 OP 想要的,@EugeneSh .. 由于它是非标准的,这将取决于实现。
  • 我看不出你在哪里说过。您只声明不会修改代码。我不建议你这样做。

标签: c pointers struct initialization


【解决方案1】:

使用typeof 是唯一直接的方法,因为该结构没有标签。它也是非标准的,因此并非所有编译器都支持它。

您的选择是:

  • 保持原样
  • 使用数组表示法而不是指针表示法:

    int i=0;
    while (gsm_escapes[i++]->gsmesc != -1) {
    
        i=0;
        while (gsm_escapes[i]->gsmesc != -1) {
    
  • 使用typeof 为结构创建typedef。这样typeof 表达式只会出现一次:

    typedef typeof(*gsm_escapes) struct_gsm_escapes;
    ...
    struct_gsm_escapes *esc;
    

【讨论】:

  • 谢谢 - “保持原样” 是我现在要做的。如问题所述,您的第一个和第三个建议是不可接受的。
  • @robert 我使用typedef 添加了另一个替代方案,并删除了标记选项。另外,我可以理解不想改变别人的声明,但是你为什么不想使用数组语法呢?
  • 尽管有一些说法,但并非一切都是可能的。
  • 是的,但有时您只需要询问专家即可确定。我认为typeof() 的方式可能是最合适的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
相关资源
最近更新 更多