总的来说,与Struct相比,使用OpenStruct有什么优缺点?什么类型的一般用例适合这些?
在C中按值传递结构是否有任何缺点,而不是传递指针?
如果结构很大,显然存在复制大量数据的性能方面,但对于较小的结构,它应该基本上与将多个值传递给函数相同.
当用作返回值时,它可能更有趣.C只有函数的单个返回值,但是你经常需要几个.所以一个简单的解决方案是将它们放在一个结构中并返回它.
是否有任何理由支持或反对这一点?
因为对于每个人来说,我在这里谈论的内容可能并不明显,所以我举一个简单的例子.
如果您使用C编程,您迟早会开始编写如下所示的函数:
void examine_data(const char *ptr, size_t len)
{
...
}
char *p = ...;
size_t l = ...;
examine_data(p, l);
Run Code Online (Sandbox Code Playgroud)
这不是问题.唯一的问题是你必须同意你的同事的参数顺序,所以你在所有功能中使用相同的约定.
但是当你想要返回相同类型的信息时会发生什么?你通常得到这样的东西:
char *get_data(size_t *len);
{
...
*len = ...datalen...;
return ...data...;
}
size_t len;
char *p = get_data(&len);
Run Code Online (Sandbox Code Playgroud)
这很好,但问题更多.返回值是返回值,但在此实现中它不是.从上面没有办法说明函数get_data不允许查看len指向的内容.并且没有任何东西可以使编译器检查实际通过该指针返回的值.那么下个月,当其他人修改代码时却没有正确理解它(因为他没有阅读文档?)它会在没有人注意的情况下破坏,或者随机开始崩溃.
所以,我提出的解决方案是简单的结构
struct blob { char *ptr; size_t len; }
Run Code Online (Sandbox Code Playgroud)
这些例子可以像这样重写:
void examine_data(const struct blob data)
{
... use data.tr and data.len ...
}
struct blob = { .ptr = ..., .len = ... };
examine_data(blob); …Run Code Online (Sandbox Code Playgroud) 我收到这个错误:
警告:内置函数'malloc'的不兼容隐式声明
我想这样做:
fileinfo_list* tempList = malloc(sizeof(fileinfo_list));
Run Code Online (Sandbox Code Playgroud)
仅供参考,手头使用的结构是:
typedef struct {
fileinfo** filedata;
size_t nFiles;
size_t size;
size_t fileblock;
} fileinfo_list;
Run Code Online (Sandbox Code Playgroud)
我没有看到我所做的事情有什么不妥.我只是创建一个tempList1 x的大小fileinfo_list.
我有一个定义结构的快速框架:
public struct CollectionTO {
var index: Order
var title: String
var description: String
}
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法使用另一个导入库的项目中的隐式成员智能初始化程序.错误是'CollectionTO'无法初始化,因为它没有可访问的初始化程序.即它没有给出默认的隐式成员明智的初始化者public关键字.
var collection1 = CollectionTO(index: 1, title: "New Releases", description: "All the new releases")
Run Code Online (Sandbox Code Playgroud)
我必须添加我自己的init方法,如下所示:
public struct CollectionTO {
var index: Order
var title: String
var description: String
public init(index: Order, title: String, description: String) {
self.index = index;
self.title = title;
self.description = description;
}
}
Run Code Online (Sandbox Code Playgroud)
...但是如果还有其他人知道的话,我宁可不要这样做?
我正在尝试找到一种方便的方法来初始化'pod'C++结构.现在,考虑以下结构:
struct FooBar {
int foo;
float bar;
};
// just to make all examples work in C and C++:
typedef struct FooBar FooBar;
Run Code Online (Sandbox Code Playgroud)
如果我想在C(!)中方便地初始化它,我可以简单地写:
/* A */ FooBar fb = { .foo = 12, .bar = 3.4 }; // illegal C++, legal C
Run Code Online (Sandbox Code Playgroud)
请注意,我想明确地避免使用以下表示法,因为如果我将来更改结构中的任何内容,它会让我感到沮丧:
/* B */ FooBar fb = { 12, 3.4 }; // legal C++, legal C, bad style?
Run Code Online (Sandbox Code Playgroud)
为了实现与/* A */示例中相同(或至少类似)的C++ ,我将不得不实现一个愚蠢的构造函数:
FooBar::FooBar(int foo, float bar) : foo(foo), bar(bar) {}
// -> …Run Code Online (Sandbox Code Playgroud) 我正在使用自动实现的属性.我想解决以下问题的最快方法是声明我自己的支持变量?
public Point Origin { get; set; }
Origin.X = 10; // fails with CS1612
Run Code Online (Sandbox Code Playgroud)
错误消息:无法修改'expression'的返回值,因为它不是变量
尝试修改作为中间表达式结果的值类型.由于该值未持久存在,因此该值将保持不变.
要解决此错误,请将表达式的结果存储在中间值中,或使用中间表达式的引用类型.
你可以将一个结构的一个实例分配给另一个,如下所示:
struct Test t1;
struct Test t2;
t2 = t1;
Run Code Online (Sandbox Code Playgroud)
我看到它适用于简单的结构,它是否适用于复杂的结构?
编译器如何知道如何根据类型复制数据项,即区分int和字符串?
我遇到了一些包含以下内容的代码:
struct ABC {
unsigned long array[MAX];
} abc;
Run Code Online (Sandbox Code Playgroud)
何时使用这样的声明是有意义的?
我没有写C很长时间,所以我不确定我应该怎么做这些递归的东西...我希望每个单元格包含另一个单元格,但我得到一个错误沿着"田地'孩子'的行具有不完整的类型".这是怎么回事?
typedef struct Cell {
int isParent;
Cell child;
} Cell;
Run Code Online (Sandbox Code Playgroud) struct ×10
c ×5
c++ ×2
abi ×1
arrays ×1
c# ×1
coding-style ×1
immutability ×1
inheritance ×1
malloc ×1
recursion ×1
ruby ×1
swift ×1
typedef ×1
variables ×1