避免编写类似内容的最佳方法是什么
someDataStruct.longSubStructName.anotherLongName.theVariable =
someStruct.longSubStructName.anotherLongName.theVariable + 10;
设置程序和获取程序将在oop程序中变通。但是在没有任何对象的情况下,例如在C语言中处理此问题的最佳方法是什么?
答案 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;