小编Nic*_*ckB的帖子

C编译器断言 - 如何实现?

我想在错误的情况下实现一个"断言"来阻止编译,而不是在运行时失败.

我目前有一个这样的定义,它工作得很好,但它增加了二进制文件的大小.

#define MY_COMPILER_ASSERT(EXPRESSION) switch (0) {case 0: case (EXPRESSION):;}
Run Code Online (Sandbox Code Playgroud)

示例代码(无法编译).

#define DEFINE_A 1
#define DEFINE_B 1
MY_COMPILER_ASSERT(DEFINE_A == DEFINE_B);
Run Code Online (Sandbox Code Playgroud)

我如何实现它,以便它不生成任何代码(为了最小化生成的二进制文件的大小)?

c compiler-construction assertions

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

如何缓冲内存中的stdout并从专用线程写入

我有一个包含许多工作线程的C应用程序.至关重要的是,这些不会阻塞工作线程需要写入磁盘上的文件,我让它们写入内存中的循环缓冲区,然后有一个专用线程将该缓冲区写入磁盘.

工作线程不再阻塞.专用线程可以在写入磁盘时安全地阻塞,而不会影响工作线程(写入磁盘时它不会保持锁定).我的内存缓冲区调整得足够大,以至于编写器线程可以跟上.

一切都很好.我的问题是,我如何为stdout实现类似的东西?

我可以宏printf()写入内存缓冲区,但我无法控制可能写入stdout的所有代码(其中一些代码在第三方库中).

思考?NickB

c stdout file buffering

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

在C中压缩ASCII字符串

我有一些C代码在内存中存储ASCII字符串作为四字节长度后跟字符串.字符串长度在10-250字节范围内.

为了减少占用,我想在运行中单独压缩每个字符串,仍然存储(压缩字符串的)长度,然后是压缩字符串.

我不想在比单个字符串更大的范围内压缩,因为任何字符串都可以随时读/写.

有哪些库/算法可用于此目的?

谢谢你的帮助.NickB

c compression

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

Android Room + AsyncTask

我的团队开发了一个新的Android应用程序,广泛使用Room.

我不确定我们是否正确使用AsyncTask.

我们必须将所有调用包装在AsyncTasks中插入/更新/删除,这会产生大量的AsyncTasks.所有进入房间的电话都来自后台服务.活动或片段没有直接的房间访问权限 - 他们通过LiveData获取所有内容.

插入行的示例调用:

AsyncTask.execute(() -> myModelDAO.insertInstance(myModel));
Run Code Online (Sandbox Code Playgroud)

有了这个在DAO中:

@Insert
void insertInstance(MyModel model);
Run Code Online (Sandbox Code Playgroud)

android-asynctask android-room

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

从C中的任何线程获取调用堆栈

在Solaris 10上的C中,我想从进程中的任意线程获取调用堆栈.

我有许多工作线程和一个线程,它们监视它们以检测紧密循环和死锁.我想要实现的功能是监视线程在杀死它之前多次从"挂起"线程打印调用堆栈.

我知道如何通过监视线程执行pstack(使用system()或forking)来实现这一点.但是我希望能够在C中实现这个功能.有没有办法做到这一点?

我知道如何让一个线程打印其OWN调用堆栈,通过遍历堆栈,如果它遇到一个断言很有用,但不知道如何在同一个进程中为另一个线程执行此操作.

谢谢你的帮助.NickB

c stack multithreading solaris call

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

Solaris 门的 Linux 实现

我正在将一些 Solaris 代码移植到 Linux。此代码使用 Solaris 特定的门函数。

Linux 有等效的吗?我找到了几个例子,但它们似乎已经很多年没有更新了。

http://www.rampant.org/doors

http://sourceforge.net/projects/ldoor

linux solaris

5
推荐指数
1
解决办法
2983
查看次数

C编译器断言:如何在修复表达式的地方动态使用它们?

我的代码广泛使用这样的编译器断言来在构建时标记错误而不是运行时,并通过在运行时不执行断言来提高性能.

#define COMPILER_ASSERT(EXPR)    switch (0) {case 0: case (EXPR):;}
Run Code Online (Sandbox Code Playgroud)

都好.我想扩展这个以使用编译器断言来实现以下情况.假设我有一个从100个地方调用的宏,其中99个传递一个固定值,其中1个传递一个变量.我如何编写宏以使其成为99个位置的编译器断言和最后一个中的运行时断言.

如果我可以保证MY_FUNCTION()总是以固定值调用,我可以这样编码.

void my_function(int x)
{
  //do something
}

#define MY_FUNCTION(X) \
  COMPILER_ASSERT(X != 0); \
  my_function(X)

//These can all take advantage of a compiler assert.
MY_FUNCTION(1);
MY_FUNCTION(SOME_HASH_DEFINE);
MY_FUNCTION(sizeof(SOME_STRUCTURE));
//This can't (this is a contrived example - actual code is complex).
int some_variable = 1;
MY_FUNCTION(some_variable);
Run Code Online (Sandbox Code Playgroud)

所以,如果我不能保证X是固定的,但想要利用每次调用MY_FUNCTION()的位置,我该怎么编码呢?就像是:

#define MY_FUNCTION(X) \
  if (X is a fixed value) COMPILER_ASSERT(X != 0); \
  else assert(X != 0); \ 
  my_function(X)
Run Code Online (Sandbox Code Playgroud)

将调用MY_FUNCTION()重新编码为仅传递固定值对我来说不是一个选项.是的我可以定义MY_FUNCTION_FIXED_X和MY_FUNCTION_VARIABLE_X,但是这会将所有这些暴露给调用代码.

谢谢你的帮助.NickB

c compiler-construction assert

5
推荐指数
1
解决办法
484
查看次数

如何捕获表单sizeof(#define)的错误

我确信有时候有充分的理由把sizeof()作为C中的#define,但我偶尔会遇到一些错误,其中有人将sizeof()作为#define而不是sizeof()作为一个结构(在我的codebase我不需要把sizeof()作为#define).

例如(做作,但希望说明一点):

typedef struct my_struct
{
  fields
} MY_STRUCT;

#define MY_DEFINE 1234
my_size = sizeof(MY_DEFINE);  // Should be sizeof(MY_STRUCT)
Run Code Online (Sandbox Code Playgroud)

是否有任何简单,自动化的方式来捕捉这个?

谢谢你的帮助.NickB

c sizeof

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