Jump to Navigation

C++

C/C++编程

C++2011添加的关键字

关键字:
constexpr
auto
decltype
static_assert
char16_t
char32_t
wchar_t
nullptr
final
override

符号:
->
[]
>>
&& "rvalue reference"
[[ 和 ]]

Category:

C++0x中的表达式类型自动推导

最近C++最新标准C++2011正式发布了,几乎同时,作为*nix平台标准编译器的GCC 4.6版本也正式发布。
对于想尝鲜的已经可以使用了。
今天遇到一个比较复杂的类型,与模板相关的,写了几次,都说变量的定义不对,想起来C++中有类型推导,翻了一下资料,找到了typeof(exp)这个东西,用起来方便多了。
但是正测试 -std=c++0x的时候又出了问题,再一查,原来有新的方式实现,
typedef decltype(exp) TmpType;
TmpType a;
...
由于要在不同环境下编译,新的方式在老的编译器环境不能用,老的方式在新的环境下不能,只好找了C的#if指令处理,

#if ((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) && __GXX_EXPERIMENTAL_CXX0X__)
// typedef decltype(exp) 方式
#else
// typeof(exp) 方式。
#endif

Category:

asterisk中自定义fd_set扩展select能处理的文件描述符个数的研究

asterisk中自定义fd_set与FD_ZERO,FD_SET几个量扩展select能处理的文件描述符个数的研究

在asterisk中,仍旧使用select处理socket文件描述符的读写事件驱动,虽然有点老套,但这种方式的移植性更好,现在几乎所有的平台都支持这个函数。如果使用一些特定平台的功能,像linux的epoll或者BSD的kqueue,还有solaris的什么 方式,都需要做一个核心兼容这几种不同操作系统上的方式。

由于进程可使用的文件描述符可使用ulimit -n 32768来设置,而系统自带的FD_SETSIZE却是固定的值,在/usr/include/bits/typesizes.h,目前我在使用的linux服务器系统上,这个值都定义为1024。对于像asterisk这样的服务,当然这个值太小了,不足以完全发挥asterisk和服务器硬件的功能。

现在我们研究下它如何,在include/asterisk/select.h文件开头,有这么一个定义,

typedef struct {
TYPEOF_FD_SET_FDS_BITS fds_bits[4096 / SIZEOF_FD_SET_FDS_BITS]; /* 32768 bits */
} ast_fdset;

ISO C++委员会批准C++0x最终草案

IS0 C++委员会正式批准了C++编程语言国际标准最终草案(FDIS)。标准本身已经完成,接下来将是根据委员会会议修改意见更新工作草案,预计将用三周时间完成FDIS草案,然后交给日内瓦的ITTF,最新的C++标准将在夏天发布,先前被临时命名为C++0x的新标准将被称为C++ 2011。从2003年发布的C++03到2011年的C++ 2011,新标准的制定历经了8年时间。GCC和Visual C++编译器都已加入了C++2011/C++0x的支持。 C++0x FAQ(由C++作者Bjarne Stroustrup维护)

C++2011标准正式出炉了.

Category:

在asterisk中添加skype的SILK语音编码的进展

SILK语音编码/解码器本用于skype的语音聊天传输格式,在2009年底的时候开放源码,这是一种语音质量相当不错的语音编码,很多VOIP还始应用SILK。
这在方面freeswitch反应能快速,在2010年中的时候就开始尝加入对silk的支持,到现在已经比较成熟,完全能用于生产环境了。
而asterisk对此则稍微迟了一点,在2010年底,开始了asterisk-1.10版本的开发后才讨论把silk引入到asterisk中,目前在官方的svn主干中有silk的相关代码。经测试也可以使用,但这个开发版本的asterisk不能用于生产环境。
现在如果要在asterisk上使用silk,必须把对 silk的支持backport到asterisk-1.8版本,这个工作目前进展不错,已经加入了silk 8kHz的支持。
由于aterisk-1.8的语音编码架构的限制,作为一种能支持不同采样率的silk编码,它只能一次支持一种采样率,如果需要支持silk所有4种采样率,相当于对asterisk-1.8添加4种语音编码。
分别为:silk8,silk12,silk16,silk24

Category:

firebreath: 跨平台跨浏览器插件开始框架

使用这个框架,可以方便的编写不同平台,不同浏览器的插件,支持win,linux,mac,支持IE(activex), firefox(NPAPI), opera, safari, google chrome浏览器等。

主页,http://www.firebreath.org/

不错的平台框架。
不过,现在网页插件这种方式,有点不太受欢迎。

Category:

解决openssh与ssh2之间文件传输

ssh2一个商业的ssh服务协议实现,其实现的scp模块与GPL的openssh的scp不兼容,在客户端的用openssh的scp向服务端为ssh2的服务器传输文件时失败,原因也在于此。
但如果scp使用sftp传输,则无论服务端是openssh还是ssh2的,都不会有问题,这引出了openssh中的scp使用sftp协议传输的补丁要求。

根据5.4版本的scp over sftp,移植到了最新的openssh 5.7版本,初步测试没有问题,

5.4的补丁,http://www.phys98.homeip.net/~ide/aboutopenssh-e.html

5.7的补丁,

Taxonomy upgrade extras:

原来qt的qmake已经能使用pkgconfig功能了

还没确定从哪版本开始支持的,我现在用的qt 4.7.1是已经支持了的,好像是在4.7.0版本加入的这个功能。

使用方法,

CONFIG += link_pkgconfig # enable the PKGCONFIG feature
PKGCONFIG += glib-2.0 # link against glib-2.0

另外,还可检没某个包是否存在,

packagesExist(glib-2.0) {
DEFINES += HAS_GLIB
PKGCONFIG += glib-2.0
}

// and in the code:
#ifdef HAS_GLIB
// use glib here
#endif

这样使用pkgconfig的功能,已经非常简便了
还有一点疑问,这个在非linux系统上,如mac, win上是什么表现呢。

使用select+blocked socketpair模拟新版本内核才支持的nonblock socketpair

话说服务器系统太老真是不爽,现在使用大多数服务器系统都是debian5,而这个系统的内核版本2.6.26,glibc 2.7,一些很方便的函数像pipe2, nonblock socketpair恰好从内核2.6.27开始支持,需要用到这个功能,又不能不兼容这要部署的服务器版本,真郁闷。
现在要实现一个线程间的非阻塞通信,本来在使用的桌面系统上找到pipe2,从man手册上看完全符合使用要求,没想到在服务器上先测试了一下,直接没有这个函数,查了一下手册,这个原来从glibc 2.9加入的。
后面又找到了socketpair函数,这个也非常方便,这回还先看了一下服务器,有这个函数,可谁知系统又没有定义一个叫SOCK_NONBLOCK的宏,无法使用它的nonblock模式。

苦苦思索一番,找到一种解决办法,完整的方法是,
使用#ifdef编译指令,加select block模式的socketpair,这样即能在新系统上使用,也可在比较旧的系统上运行。

大概步骤如下,

首先使用socketpair创建一对已经连接的socket,

我的第一个kde4程序

在使用bespin中的xbar kde4 plasma applet的时候,遇到一个自定义菜单的功能,希望在菜单中有一功能,能最小化所有的窗口,能恢复所有窗口功能。
没有找到现成的工具或者方法,所以写了一个简单的使用kde4基础库的小工具来实现这一功能。另外这个小程序还有一个功能,可根据程序名字把其窗口提到最上层,展示给用户,这功能用于使用dolphin显示某些固定文件夹,如在已经开启的dolphin中显示文档目录,并把dolphin拉到最上层。

刚开始写kde4的程序,只用了kde4基础库的三个类,代码:

Category:

页面

订阅 RSS - C++


Main menu 2

by Dr. Radut