处理嵌套结构访问

时间:2018-08-16 19:01:03

标签: c

避免编写类似内容的最佳方法是什么

someDataStruct.longSubStructName.anotherLongName.theVariable = 
    someStruct.longSubStructName.anotherLongName.theVariable + 10;

设置程序和获取程序将在oop程序中变通。但是在没有任何对象的情况下,例如在C语言中处理此问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

创建指向相关变量的指针:

int *someDataVar1 = &someDataStruct.longSubStructName.anotherLongName.theVariable;
int *someDataVar2 = &someStruct.longSubStructName.anotherLongName.theVariable;

*someDataVar1 = *someDataVar2 + 10;

如果您在代码块中多次使用这样的深度嵌套字段,则执行此类操作可以帮助提高可读性。如果您只需要使用一次或两次,那么最好不做任何改动。

在下面的示例中,这样的构造可能有意义:

for (clientNum = 0; clientNum < clientCount; clientNum++) {
    printf("name: %s\n", mainStructure.subStructure.clientList[clientNum].name);
    printf("address: %s\n", mainStructure.subStructure.clientList[clientNum].address);
    printf("identifier: %x\n", mainStructure.subStructure.clientList[clientNum].identifier);
    printf("file count: %d\n", mainStructure.subStructure.clientList[clientNum].fileCount);

    for (fileNum = 0; fileNum < mainStructure.subStructure.clientList[clientNum].fileCount; fileNum++) {
        printf("filename: %s\n", mainStructure.subStructure.clientList[clientNum].fileList[fileNum].fileName);
        printf("size: %d\n", mainStructure.subStructure.clientList[clientNum].fileList[fileNum].size);
        printf("checksum: %d\n", mainStructure.subStructure.clientList[clientNum].fileList[fileNum].checksum);
        mainStructure.subStructure.clientList[clientNum].fileList[fileNum].printed++;
    }

    mainStructure.subStructure.clientList[clientNum].printed++;
}

这里有很多详细的重复信息。如此之多,以至于很难看清您实际使用的工具。可以使它更具可读性,如下所示:

for (clientNum = 0; clientNum < clientCount; clientNum++) {
    struct client *thisClient = &mainStructure.subStructure.clientList[clientNum];
    printf("name: %s\n", thisClient->name);
    printf("address: %s\n", thisClient->address);
    printf("identifier: %x\n", thisClient->identifier);
    printf("file count: %d\n", thisClient->fileCount);

    for (fileNum = 0; fileNum < thisClient->fileCount; fileNum++) {
        struct file *thisFile = &thisClient.fileList[fileNum];
        printf("filename: %s\n", thisFile->fileName);
        printf("size: %d\n", thisFile->size);
        printf("checksum: %d\n", thisFile->checksum);
        thisFile->printed++;
    }

    thisClient->printed++;
}

答案 1 :(得分:0)

如果可以将内部结构设为匿名typedef,则可以使用plan9扩展名直接访问子结构的成员(假设没有任何变量名冲突)。 免责声明:由于我更喜欢​​符合标准的C语言,因此我不推荐使用此方法,但是我想将其放宽,因为它确实存在。这是一个例子:

#include <stdlib.h>
#include <stdio.h>

typedef struct{
   int x;
   int y;
} inner_struct1;

typedef struct{
   int v;
   int w;
} inner_struct2;

struct outer_struct {
   inner_struct1;
   inner_struct2;
   int a;
   int b;
   int c;
};

int main(void)
{
   struct outer_struct os;
   os.x = 1;
   os.y = 2;
   os.v = 3;
   os.w = 4;
   os.a = 5;
   os.b = 6;
   os.c = 7;

   printf("inner_struct1.x: %d, inner_struct1.y: %d, inner_struct2.v: %d,
       inner_struct2.w: %d os.a: %d, os.b: %d, os.c: %d\n",
       os.x, os.y, os.v, os.w, os.a, os.b, os.c);
}

使用gcc,您必须使用-fplan9-extensions-fms-extensions进行编译。 clang没有plan9,因此只有-fms-extensions可以工作。

答案 2 :(得分:0)

将这些操作转移到一个具有全名的函数中,并使用内联。

inline void someFunctionNameAdd(int val)
{
    someDataStruct.longSubStructName.anotherLongName.theVariable = 
         someStruct.longSubStructName.anotherLongName.theVariable + val;
}

然后调用函数someFunctionName(10);

其他使用定义宏的方法:

#define SOME_MEANINGFULLNAME \
          someDataStruct.longSubStructName.anotherLongName.theVariable

然后: SOME_MEANINGFULLNAME + = 10;