最近在我的C肌肉上工作,并查看我一直在使用它的许多图书馆,这当然让我很好地了解了什么是好的做法.我没见过的一件事是一个返回结构的函数:
something_t make_something() { ... }
Run Code Online (Sandbox Code Playgroud)
从我所吸收的,这是"正确"的方式:
something_t *make_something() { ... }
void destroy_something(something_t *object) { ... }
Run Code Online (Sandbox Code Playgroud)
代码片段2中的体系结构比片段1更受欢迎.所以现在我问,为什么我会直接返回一个结构,就像在代码片段1中一样?当我在两种选择中做出选择时,我应该考虑哪些差异?
此外,该选项如何比较?
void make_something(something_t *object)
Run Code Online (Sandbox Code Playgroud) struct parent
{
char a;
char b;
};
struct child
{
struct parent parent;
int c;
char d;
};
struct grandchild
{
struct child child;
long e;
};
void print_parent_val(struct parent *p)
{
printf("%d\n", p->a);
}
int main (int argc, char **argv)
{
struct grandchild g;
g.child.parent.a = 69;
print_parent_val((struct parent *)&g);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序编译(没有警告)并运行正常并按69预期打印.我从未见过任何实现此继承技术的代码,因此我非常犹豫地认为这是"好".
编辑:如何将孙子变成一个孩子?中期转换也可能吗?
void print_parent_val(struct child *c)
{
printf("%c\n", c->d);
}
int main (int argc, char **argv)
{
struct grandchild g;
g.child.parent.a = …Run Code Online (Sandbox Code Playgroud) 我正在尝试执行,go build -buildmode=shared -linkshared test但出现错误:
go 1.10: cannot implicitly include runtime/cgo in a shared library
Run Code Online (Sandbox Code Playgroud)
我那个包里只有一个文件
lib.go
package test
import "fmt"
func Hello() {
fmt.Println("Hi")
}
Run Code Online (Sandbox Code Playgroud)
我在运行go1.10.4 linux / amd64的linux机器上
我知道有些结构,可能会,也可能不会,在元素之间添加填充.
我当前的项目是从/ dev/input文件读取输入.这些文件的二进制布局定义<linux/input.h>如下:
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
Run Code Online (Sandbox Code Playgroud)
我想知道这个结构没有标记打包属性.这意味着/ dev/input文件(逐位打包)不能保证与struct相同的包匹配.因此逻辑
struct input_event event;
read(fd, &event, sizeof(event));
Run Code Online (Sandbox Code Playgroud)
未定义为跨所有拱门工作.
我的逻辑中有谬误吗?或者可以安全地假设某些事情不会被打包?
我有一个日志文件errors.log,软件用来报告错误.该软件本身不会创建errors.log,因此该文件必须事先存在.
问题是,如果我添加它,.gitignore那么开发人员需要在他们的机器上手动创建它.如果我不忽略它,那么每个开发人员都会errors.log在测试后提交他们自己的内容......在合并时证明了一个很大的麻烦.
如何使新开发人员errors.log在最初克隆它时获取空白副本,但是在使用时不会将其添加到工作树(无论更改)git add -A?
我的键盘有音量控制。我正在尝试直接触发/模拟音量增大事件。使用xxd -c 24 event5,我可以监视文件包含的内容。当我使用实际的音量按钮时,它会正常触发它。下面是一个 C 脚本,它写入按钮发送的确切数据。
int main()
{
int f = open("/dev/input/event5", O_WRONLY);
if(f == -1)
{
perror("Could not open event5");
return 1;
}
struct input_event e;
gettimeofday(&e.time, 0);
e.type = 0x0400;
e.code = 0x0400;
e.value = 0x0e9000c00;
write(f, &e, sizeof(e));
gettimeofday(&e.time, 0);
e.type = 0x0100;
e.code = 0x7300;
e.value = 0x01000000;
write(f, &e, sizeof(e));
gettimeofday(&e.time, 0);
e.type = 0x0000;
e.code = 0x0000;
e.value = 0x00000000;
write(f, &e, sizeof(e));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是xxd -c 24 event5 …
当ecryptfs等软件使用AES时,它会要求输入用户密码(例如"password123").
AES算法本身不需要用户密码.那么"password123"在哪里被投入数学?
我正在努力创建一个使用密码加密某些数据的C函数.我知道使用OpenSSL和aes密钥执行此操作的典型方法,但我不知道如何集成用户密码.