Могу ли я преобразовать указатель структуры, чтобы он указывал на начальный анонимный член в C1x? Это даже правильный вопрос? - PullRequest
1 голос
/ 03 августа 2011

Я немного озадачен анонимными структурами в C1x.Применяется ли правило, что указатель структуры, соответствующим образом преобразованный, указывает на его первый член, применяется к исходной анонимной структуре или просто к начальному члену начальной анонимной структуры?В частности, имеет ли смысл эта программа в C1x?

#include<stdio.h>

struct node {
    struct node *next;
};

/* Does C1x even allow this? Do I have to define struct node inside of inode?
 * Are anonymous struct members even allowed to have tags?
 */
struct inode {
    struct node;
    int data;
};

int main(void) {
    inode node1 = {NULL, 12};
    inode *ihead = &inode;
    node *head = (struct node *)ihead;

    /* These should work since struct inode's first member is a struct node. */
    printf("Are these equal? %c", head == &node1.next ? 'Y' : 'N');
    printf("Is next NULL? %c", head->next == NULL ? 'Y' : 'N');

    return 0;
}

Этот ответ предполагает, что я могу задавать вопросы о неназванных структурах вместо анонимных структур.Я полностью не понимаю природу анонимных структур?

Ответы [ 2 ]

3 голосов
/ 10 сентября 2011
/* Does C1x even allow this? Do I have to define struct node inside of inode?
 * Are anonymous struct members even allowed to have tags?
 */
struct inode {
    struct node;
    int data;
};

Во-первых, член struct node не является анонимным .Это без имени , но поскольку он имеет тег (node), он не удовлетворяет определению C1x «анонимный».

Кроме этого, это явно разрешено C1xграмматика.Поскольку SO на самом деле не поддерживает подписки, я пометил необязательные элементы квадратными скобками;Я также исключил правила грамматики, которые не нужны, чтобы видеть, что это действительно:

type-specifier:
    struct-or-union-specifier
struct-or-union-specifier:
    struct-or-union [identifier] { struct-declaration-list }
struct-or-union:
    struct
    union
struct-declaration-list:
    struct-declaration
    struct-declaration-list struct-declaration
struct-declaration:
    specifier-qualifier-list [struct-declarator-list];
specifier-qualifier-list:
    type-specifier [specifier-qualifier-list]

Есть также 4 ограничения, которые должны быть выполнены, но ни одно из них не относится к неназванным элементам, так что этосинтаксически верный C.

Теперь перейдем к вашему реальному вопросу.C1x говорит:

Указатель на объект структуры, соответствующим образом преобразованный, указывает на его начальный член (...) и наоборот.

Полный останов.Нет "если этот участник не назван".Таким образом, указатель на node1 также является указателем на неназванный начальный член, также является указателем на node1.next.Однако, здесь это становится немного шерстистым.Возможно, я просто пропустил предложение, но кажется, что C1x только говорит, что:

Члены анонимной структуры или объединения считаются членами содержащей структуры или объединения.

Я не могу найти язык, говорящий о том, что члены неназванной структуры считаются членами содержащей структуры.На самом деле может быть так, что не существует гарантированного способа доступа к next, кроме указания указателя.Я напишу некоторым членам комитета, чтобы попросить разъяснений по этому вопросу.

У вас также могут возникнуть проблемы с инициализацией:

Безымянные члены объектов структуры имеют неопределенное значение дажепосле инициализации.

0 голосов
/ 13 сентября 2011

Попробуйте использовать узел в качестве имени типа. Избегайте повторного объявления "struct node".

struct inode {
    node n;//node is a already a defined type name, n is the var name
    int data;
};
...