小编fyh*_*ang的帖子

(void)'变量名'在C函数的开头做了什么?

我正在从FUSE阅读这个示例代码:

http://fuse.sourceforge.net/helloworld.html

我无法理解以下代码片段的作用:

static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
                         off_t offset, struct fuse_file_info *fi)
{
    (void) offset;
    (void) fi;
Run Code Online (Sandbox Code Playgroud)

具体来说,(void)"变量名"的东西.我以前从未在C程序中看到过这种结构,所以我甚至不知道要在Google搜索框中添加什么.我目前最好的猜测是它是未使用的函数参数的某种说明符?如果有人知道这是什么,可以帮助我,那将是伟大的.谢谢!

c fuse

55
推荐指数
2
解决办法
3万
查看次数

RtlInitializeExceptionChain做了什么,如何减少其执行开销?

我试图找到我的程序中的瓶颈(目前处于"低悬的水果"阶段),并使用分析器我得到如下内容:

困了截图

我在这里看到的是RtlInitializeExceptionChain占用了大部分时间,而我实际程序中的函数甚至没有进入这个顶级列表.我想知道是否有人知道RtlInitializeExceptionChain做了什么,如何调用它,以及如何重新组织我的程序而不是这么称呼它?

关于我的项目的一些其他信息:它是使用ATL的COM API,被分析的程序是一个"测试"C++程序,它使用这个API.

谢谢!

c++ com optimization

23
推荐指数
4
解决办法
1万
查看次数

如何直接从char*数组创建一个std :: string而不复制?

假设我有一个字符数组,我已在堆上分配,并且我想将其转换为std :: string.目前我正在做以下事情:

char *array = new char[size];
WriteIntoArray(array, size);
std::string mystring(array);
delete[] array;
return mystring; // or whatever
Run Code Online (Sandbox Code Playgroud)

从我在互联网上读到的内容(http://www.cplusplus.com/reference/string/string/string/),字符串构造函数执行我传递它的缓冲区的副本,让我释放缓冲区(稍后,该字符串释放其内部缓冲区).我想要做的是分配我的缓冲区,将它的控制转移到字符串,然后在它被破坏时让它释放我的缓冲区.

这个问题从字符*初始化的std :: string没有副本看起来前途无量,但我的代码依赖于(在上面的例子中"WriteIntoArray")API调用它必须写入字符数组,所以我必须创建一个C风格char*buffer,并且不能将我的代码转换为仅使用内置字符串操作(这是建议的答案).

有没有一些标准的方法来做到这一点,或者我应该写我自己的字符串类(呃)?谢谢!

c++ string buffer stl

18
推荐指数
3
解决办法
2万
查看次数

如何在Go中将数组复制到另一部分?

我是Go的新手,并希望将一个数组(切片)复制到另一个数组中.例如,我有一个largeArray [1000]字节或者什么和一个smallArray [10]字节,我希望largeArray的前10个字节等于smallArray的内容.我试过了:

largeArray[0:10] = smallArray[:]
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.是否有内置的类似memcpy的功能,或者我只需要自己写一个?

谢谢!

go

11
推荐指数
1
解决办法
1万
查看次数

将BSTR传递到C#(COM互操作)的COM函数的约定

我正在编写用C++编写COM的API,还编写一个在C#中使用这个API的程序.我的问题是关于将BSTR传递给COM函数时的BSTR内存管理语义.说我的IDL看起来像:

HRESULT SomeFunction([in] BSTR input);
Run Code Online (Sandbox Code Playgroud)

目前这个功能是这样实现的:

HRESULT SomeFunction(BSTR input) {
    // Do stuff ..., then:
    SysFreeString(input);
}
Run Code Online (Sandbox Code Playgroud)

当我用C#调用它时,C#SomeFunction(myString)会生成这样的东西(伪代码):

myString = SysAllocString("string");
SomeFunction(myString);
Run Code Online (Sandbox Code Playgroud)

或者更喜欢这样:

myString = SysAllocString("string");
SomeFunction(myString);
SysFreeString(myString);
Run Code Online (Sandbox Code Playgroud)

也就是说,C#是否释放它生成的BSTR来编组COM接口,还是应该在我的函数中释放它?谢谢!

c# c++ com com-interop

9
推荐指数
1
解决办法
3388
查看次数

通过网络传输协议缓冲区的典型方法?

我正试图在网络程序中使用Google的协议缓冲区(protobuf),使用裸套接字.我的问题是:在发送方发送消息后,接收方如何知道发送了什么类型的消息?例如,假设我有消息定义:

message StrMessage {
    required string str = 1;
}

message IntMessage {
    required int32 num = 1;
}
Run Code Online (Sandbox Code Playgroud)

现在,发送器对其进行StrMessage序列化,并通过网络发送序列化字节.接收器如何知道使用StrMessage而不是IntMessage反序列化字节?我试过做两件事:

// Proposal 1: send one byte header to indicate type
enum MessageType {
    STR_MESSAGE = 1;
    INT_MESSAGE = 2;
}

// Proposal 2: use a wrapper message
message Packet {
    optional StrMessage m_str = 1;
    optional IntMessage m_int = 2;
}
Run Code Online (Sandbox Code Playgroud)

但是,这些似乎都不是很干净,并且都要求我手动列出所有消息类型.是否有规范/更好的方法来处理这个问题?

谢谢!

python sockets networking protocol-buffers

6
推荐指数
1
解决办法
3422
查看次数

如何使用SOCK_DGRAM制作双向unix域套接字?

我正在尝试编写一个简单的Unix数据报服务器/客户端,并且遇到了一些问题.我想要的是一个服务器,它监听数据报套接字并将收到的每条消息的回复发送给原始发送者.我决定首先尝试使用socat"服务器"并在C中编写客户端.我正在运行这样的socat:

socat UNIX-DGRAM:/tmp/test.socket,fork EXEC:echo
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这应该监听/tmp/test.socket并回复使用相同字符串收到的所有内容?然后我有一个看起来像这样的客户端程序(为清楚起见,删除了错误检查):

int s = socket(AF_UNIX, SOCK_DGRAM, 0);
struct sockaddr_un sa;
sa.sun_family = AF_UNIX;
strcpy(sa.sun_path, "/tmp/test.socket");

const char *data = "Testing data";
int err = sendto(s, data, strlen(data), 0, (struct sockaddr *)(&sa), sizeof(struct sockaddr_un));

printf("Sent!\n");

unsigned char *buffer = malloc(BUFFER_LENGTH);
struct sockaddr_storage recv_sa;
int recv_sa_len = 0;
int recv_len = recvfrom(s, buffer, BUFFER_LENGTH, 0, (struct sockaddr *)&recv_sa, &recv_sa_len);

for (int i = 0; i < recv_len; i++) {
    putc(buffer[i], stdout);
}
printf("\n");
Run Code Online (Sandbox Code Playgroud)

它应该发送数据包(有效),接收数据包,然后将其打印出来,但程序似乎无法接收数据包.我在这里做错了什么,或者我对Unix套接字有一个根本的误解?谢谢!

c network-programming datagram socat unix-socket

4
推荐指数
1
解决办法
9400
查看次数

仅在C#中的特定时间触发事件

我正在用C#编写一个视频游戏,我想只在游戏循环的特定点处理某些事件(例如键盘/鼠标事件).例如,有没有办法写出如下内容:

void gameLoop()
{
    // do updates
    handleAllEvents();
    render();
}
Run Code Online (Sandbox Code Playgroud)

如果事件发生在循环中的某个其他点,我想等到handleAllEvents()处理它们."事件"我的意思是标准的C#事件系统,例如:

public event Action<object, KeyboardEventArgs> KeyPressed;
Run Code Online (Sandbox Code Playgroud)

如果问题没有明确表达,请告诉我.谢谢!

c# events opentk

2
推荐指数
1
解决办法
531
查看次数

如何在Python和Flask中清理用户提供的路径?

我在Python/Flask Web应用程序中使用用户提供的名称作为路径组件:例如,用户创建一个名为"hello"的项目,提示我的Web应用程序创建一个名为"data/hello /"的文件夹来存储文件用户将上传.我想知道如何清理用户提供的名称,以便例如用户不能输入"../hello"并且在不同的目录中创建文件夹.我能想出的最好的基于路径名的解决方案是这样的:

import os.path
rpath = os.path.relpath(input_path)
safepath = rpath[rpath.index('../'):]
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来确保我的网络应用程序不访问目录之外的data文件?谢谢!

python security user-input web-applications flask

2
推荐指数
1
解决办法
2985
查看次数

MurmurHash3可以分多个部分对数据块进行哈希处理吗?

我想使用MurmurHash3唯一地识别大型数据。此实现:

http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.h

不过,似乎并没有提供一种增量更新哈希的方法-它似乎为给定的每个数据块计算一个单独的哈希。例如,如果我要对磁盘中的512MB数据进行哈希处理,则可能不想一次将其全部加载到内存中,或者如果我要对网络中的未知数据进行哈希处理。有没有人曾经在这样的上下文中使用过MurmurHash3(以增量方式散列大量数据)?如果您可以向我介绍一些资源或替代实施,那将非常好:)。我正在寻找与SHA256_UpdateOpenSSL 类似的东西。

谢谢!

c++ sha murmurhash

0
推荐指数
1
解决办法
1104
查看次数