小编smc*_*ron的帖子

你最喜欢的C编程技巧是什么?

例如,我最近在linux内核中遇到过这个问题:

/* Force a compilation error if condition is true */
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))

所以,在你的代码中,如果你有一些必须的结构,比如8个字节的大小,可能是因为一些硬件限制,你可以这样做:

BUILD_BUG_ON((sizeof(struct mystruct) % 8) != 0);

除非struct mystruct的大小是8的倍数,否则它将不会编译,如果它是8的倍数,则根本不会生成运行时代码.

我知道的另一个技巧是"Graphics Gems"一书,它允许单个头文件在一个模块中声明和初始化变量,而在使用该模块的其他模块中,只是将它们声明为externs.

#ifdef DEFINE_MYHEADER_GLOBALS
#define GLOBAL
#define INIT(x, y) (x) = (y)
#else
#define GLOBAL extern
#define INIT(x, y)
#endif

GLOBAL int INIT(x, 0);
GLOBAL int somefunc(int a, int b);

有了它,定义x和somefunc的代码可以:

#define DEFINE_MYHEADER_GLOBALS
#include "the_above_header_file.h"

而仅使用x和somefunc()的代码可以:

#include "the_above_header_file.h"

所以你得到一个头文件,它声明了需要它们的全局变量和函数原型的实例,以及相应的extern声明.

那么,你最喜欢的C编程技巧是什么?

c

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

有没有一种可靠的方法来抑制linux中的屏保?

我正在寻找一种体面的,非蹩脚的方式来抑制xscreensaver,kscreensaver或gnome-screensaver,它们可能正在运行,最好是以屏幕保护程序无关的方式,它绝对必须快速执行.

我已经阅读了xscreensaver常见问题解答(http://www.jwz.org/xscreensaver/faq.html).

我有一个基于gtk的游戏程序,它在混合多个音频通道的同时发出30帧/秒,并且由于它是由操纵杆控制的,有时候"屏幕保护程序"会启动.我把"the"放在引号中,因为有至少三种不同的流行屏保,xscreensaver,gnome-screensaver和kscreensaver,每种都有自己独特且笨重的方法,应用程序可能通过它们来抑制它们.

是否有人封装了代码以将所有这些禁止成快速的代码块?哦,它必须与GPL兼容.

目前,如果检测到任何屏幕保护程序并且操纵杆正在使用中,我的代码只是抱怨不合作的屏幕保护程序开发人员,除了建议用户手动禁用屏幕保护程序之外,实际上并没有尝试做任何事情,这是我唯一能做的事情.我认为这样做非常难看,我只是拒绝这么做.

只是想知道是否有其他人遇到过这个,以及他们做了什么,如果他们做了什么,如果它看起来像我看起来那样丑陋,或者如果那里有一些优雅的解决方案......似乎可能以某种方式合成X事件来欺骗屏幕保护程序,以为某些活动可能以通用的方式完成,但我真的不知道该怎么做(并希望你不需要root来做它.)

有任何想法吗?

谢谢,

- 史蒂夫


嗯,不幸的是,至少在Fedora核心8上,这似乎不起作用.

xdg-screensaver脚本在那里,似乎打算工作,它实际上不起作用.

一旦你执行了"xdg-screensaver suspend window-id",其中窗口id就是从程序中获取的

xwindow_id = GDK_WINDOW_XWINDOW (GTK_WIDGET (widget)->window);

或者是否通过xprop获取窗口ID,并且手动运行xdg-screensaver,将创建两个进程:

[scameron@zuul wordwarvi]$ ps -efa | grep xdg
scameron  4218     1  0 20:12 pts/2    00:00:00 /bin/sh /usr/bin/xdg-screensaver suspend 0x3a00004
scameron  4223     1  0 20:12 pts/2    00:00:00 /bin/sh /usr/bin/xdg-screensaver suspend 0x3a00004
scameron  4313  3151  0 20:15 pts/1    00:00:00 grep xdg
[scameron@zuul wordwarvi]$ 

并且他们永远不会死,即使在他们应该等待死亡的程序之后,屏幕保护程序永远不会重新启用.

[scameron@zuul wordwarvi]$ xdg-screensaver status
disabled
[scameron@zuul wordwarvi]$ ls -ltr /tmp | grep …

screensaver

10
推荐指数
3
解决办法
6731
查看次数

标签 统计

c ×1

screensaver ×1