总结C++中的所有强制转换函数(const_cast,reinterpret_cast,static_cast,dynamic_cast)

http://www.libing.net.cn/read.php?520

1)static_cast<T*>(a)

将地址a转换成类型T,T和a必须是指针、引用、算术类型或枚举类型。

表达式static_cast<T*>(a), a的值转换为模板中指定的类型T。在运行时转换过程中,不进行类型检查来确保转换的安全性。

2)dynamic_cast<T*>(a)

完成类层次结构中的提升。T必须是一个指针、引用或无类型的指针。a必须是决定一个指针或引用的表达式。

表达式dynamic_cast<T*>(a) 将a值转换为类型为T的对象指针。如果类型T不是a的某个基类型,该操作将返回一个空指针。

3)const_cast<T*>(a)

去掉类型中的常量,除了const或不稳定的变址数,T和a必须是相同的类型。

表达式const_cast<T*>(a)被用于从一个类中去除以下这些属性:const, volatile, 和 __unaligned。

4)reinterpret_cast<T*>(a)

任何指针都可以转换成其它类型的指针,T必须是一个指针、引用、算术类型、指向函数的指针或指向一个类成员的指针。

表达式reinterpret_cast<T*>(a)能够用于诸如char* 到 int*,或者One_class* 到 Unrelated_class*等类似这样的转换,因此可能是不安全的。

Driver porting: the workqueue interface.

http://lwn.net/Articles/23634/

影响编译、链接、运行的环境变量

3.19 Environment Variables Affecting GCC
http://www.sunsite.ualberta.ca/Documentation/Gnu/gcc-3.0.2/html_node/gcc_53.html

Why LD_LIBRARY_PATH is bad
http://www.visi.com/~barr/ldpath.html

tcl7.6的编译问题

Debian sarge 3.1,gcc3.3下编译tcl7.6出错

gcc -c -O -fPIC -I./../generic -I. -DHAVE_UNISTD_H=1 -DHAVE_SYS_TIME_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_TM_ZONE=1 -DHAVE_TM_GMTOFF=1 -DHAVE_TIMEZONE_VAR=1 -DSTDC_HEADERS=1 -DNEED_MATHERR=1 -DHAVE_SYS_IOCTL_H=1 -DTCL_SHLIB_EXT=".so" ./../generic/tclPosixStr.c
./../generic/tclPosixStr.c: In function `Tcl_ErrnoId':
./../generic/tclPosixStr.c:340: error: duplicate case value
./../generic/tclPosixStr.c:328: error: previously used here
./../generic/tclPosixStr.c: In function `Tcl_ErrnoMsg':
./../generic/tclPosixStr.c:787: error: duplicate case value
./../generic/tclPosixStr.c:775: error: previously used here
make: *** [tclPosixStr.o] Error 1

patch file

--- tclPosixStr.c 1996-10-11 04:58:40.000000000 +0800
+++ tclPosixStr.new.c 2006-07-02 17:22:39.000000000 +0800
@@ -336,7 +336,7 @@
#ifdef ENXIO
case ENXIO: return "ENXIO";
#endif
-#ifdef EOPNOTSUPP
+#if defined(EOPNOTSUPP) && (!defined(ENOTSUP) || (ENOTSUP != EOPNOTSUPP))
case EOPNOTSUPP: return "EOPNOTSUPP";
#endif
#ifdef EPERM
@@ -783,7 +783,7 @@
#ifdef ENXIO
case ENXIO: return "no such device or address";
#endif
-#ifdef EOPNOTSUPP
+#if defined(EOPNOTSUPP) && (!defined(ENOTSUP) || (ENOTSUP != EOPNOTSUPP))
case EOPNOTSUPP: return "operation not supported on socket";
#endif
#ifdef EPERM

GCC内联汇编笔记

#ifdef __ASSEMBLER__
#define C0_SR $12
#else
#define C0_SR 12
#endif

Reg.h

#define save_static(frame) \
__asm__ __volatile__( \
“sw\t$16,”__str(PT_R16)”(%0)\n\t” \
“sw\t$17,”__str(PT_R17)”(%0)\n\t” \
“sw\t$18,”__str(PT_R18)”(%0)\n\t” \
“sw\t$19,”__str(PT_R19)”(%0)\n\t” \
“sw\t$20,”__str(PT_R20)”(%0)\n\t” \
“sw\t$21,”__str(PT_R21)”(%0)\n\t” \
“sw\t$22,”__str(PT_R22)”(%0)\n\t” \
“sw\t$23,”__str(PT_R23)”(%0)\n\t” \
“sw\t$30,”__str(PT_R30)”(%0)\n\t” \
: /* No outputs */ \
: “r” (frame))

R4kc0.h

#define _mips_mfc0(reg) \
({ \
register reg32_t __r; \
__asm__ __volatile (“%(mfc0 %0,$%1; nop; nop%)” \
: “=d” (__r) \
: “JK” (reg)); \
__r; \
})

#define _mips_mtc0(reg, val) \
({ \
__asm__ __volatile (“%(mtc0 %z0,$%1; nop; nop; nop%)” \
: \
: “dJ” ((reg32_t)(val)), “JK” (reg) \
: “memory”); \
})

6.2 Constraint Modifiers

“=” : Means that this operand is write-only for this instruction; the previous value is discarded and replaced by output data.
“&” : Means that this operand is an earlyclobber operand, which is modified before the instruction is finished using the input operands. Therefore, this operand may not lie in a register that is used as an input operand or as part of any memory address. An input operand can be tied to an earlyclobber operand if its only use as an input occurs before the early result is written.

—————————————————————
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.1
及Kernel Source摘录

scull例子程序与devfs,ldd2

问题描述:

scull编译通过以后,insmod安装,并创建了/dev/scull文件。但对/dev/scull操作时,系统提示bash: /dev/scull: No such device

问题分析:

lsmod可以见到scull模块已加载,但cat /proc/devices没有scull。检查发现,CONFIG_DEVFS_FS宏已在内核中打开,所以设备采用devfs_register注册,而不是register_chrdev。查看内核编译配置.config文件,发现:

CONFIG_DEVFS_FS=y
# CONFIG_DEVFS_MOUNT is not set

尽管内核支持devfs,但并未在系统启动时加载。

解决:

scull.h中#undef CONFIG_DEVFS_FS;
或内核中关闭devfs配置;
或使用devfsd虚拟文件系统支持devfs

通用线程: 高级文件系统实现者指南,第 5 部分
http://www-128.ibm.com/developerworks/cn/linux/filesystem/l-fs5/
通用线程: 高级文件系统实现者指南,第 6 部分
http://www-128.ibm.com/developerworks/cn/linux/filesystem/l-fs6/
Using devfs with Debian GNU/Linux and kernel 2.4.0
http://www.yk.rim.or.jp/~ishikawa/devfsd-2nd.txt

Debian下Tcl8.4下的alloc: invalid block错误

问题描述:

采用tcl库编写的程序在redhat下编译运行正常通过(tcl8.3/tcl8.4),但是在Debian Sarge下运行时出现如下错误alloc: invalid block: 0x85cd938: 69 61 41

网上类似的问题描述
http://aspn.activestate.com/ASPN/Mail/Message/2606536

问题分析:

从google group中得知,Tcl_Alloc/Tcl_Free的指针和free/malloc/strdup不能混用。这是因为Debian上的tcl库使用了-DTCL_USEALLOC=1选项进行编译。该版本的库使用了内建的thread memory allocator,因此Tcl_Alloc并不等同于直接malloc返回的指针
http://groups.google.com/group/comp.lang.tcl/browse_thread/thread/e4300a5fd97b22a7/79f0bd67ca2ad68a?lnk=st&q=alloc%3A+invalid+block&rnum=12#79f0bd67ca2ad68a

http://groups.google.com/group/comp.lang.tcl/browse_thread/thread/2f16d826826185a4/535c21cf18b6b8dc?q=alloc%3A+invalid+block&rnum=2#535c21cf18b6b8dc

查看tcl8.4-8.4.9源码可以看到,Tcl_Alloc最终使用了TclpAlloc分配内存,该函数最终返回的是Block2Ptr(blockPtr, bucket, reqsize),两种指针的区别在于头部的MAGIC number。Thread memory allocator(generic/tclThreadAlloc.c)在操作前会做校验。

static char *
Block2Ptr(Block *blockPtr, int bucket, unsigned int
reqsize)
{
register void *ptr;

blockPtr->b_magic1 =
blockPtr->b_magic2 = MAGIC;
blockPtr->b_bucket = bucket;
blockPtr->b_reqsize = reqsize;
ptr = ((void *) (blockPtr + 1));
#if RCHECK
((unsigned char *)(ptr))[reqsize] = MAGIC;
#endif
return (char *) ptr;
}

另外,tcl.h头文件中定义了ckalloc/ckfree函数,当-DTCL_MEM_DEBUG选项未打开时,实际调用Tcl_Alloc/Tcl_Free,否则加入相应的调试信息。这对函数是系统推荐的方式

subclipse:Eclipse workspace路径与文件系统不一致

FAQ链接:
http://subclipse.tigris.org/faq.html#path-case

eclipse中subclipse选用JavaSVN接口,eclipse用-data workplacepath启动

gcc and stdarg.h

高版本的gcc,如3.4.3,将stdarg.h头文件独立出来放在针对特定编译器的include文件夹中。比如/usr/lib/gcc/i386-redhat-linux/3.4.3/include

这个路径应该在gcc configure时自动指定的。
可以通过这个命令查看gcc –print-file-name=include

程序中#include ,编译时用-E进行预处理,应该可以看到gcc使用了# 1 “”。否则也可通过-I`gcc –print-file-name=include`显式制定包含路径

Migration to 8.4: CONSTification

Tcl 8.4相对于8.3引入了更严格的类型声明,在函数中不被改变的都声明了const,因此造成许多8.3的源码在8.4下无法编译通过。

http://wiki.tcl.tk/3669 该文列举了不兼容的几种类型,并给了相应的建议。

定义USE_NON_CONST宏可与8.3源码级兼容。当然也可以选择更改代码并与8.4兼容(与8.3不兼容)

Page 1 of 212