博文
关于动态链接库中导出全局常量(2010-10-17 17:15:00)
摘要:用gcc编译生成的含有调试信息的动态链接库,其中若定义了全局常量(包括基本类型与自定义的类对象)则不能得到该类的成员变量的调试信息,这可能与编译链接动态库时使用的--enable-auto-import参数有关......
win32平台下动态链接库的编译(2010-10-17 17:10:00)
摘要:本文主要讲解win32平台上用gcc编译生成动态链接库的方法,一方面做个备忘(主要自己专业不是这个,呵呵),另一方面也为不熟悉gcc在win32平台编译的朋友提供些线索
主要有两种方法:
方法一、用dllwrap工具
语法dllwrap.exe --output-def defFileName --implib implibFileName linkobj1 linkobj2 ... linklibs -o dllName
其中implibFileName是动态库对应导入库的名字,defFileName 中内容是动态库中导出符号表,linkobj1 linkobj2 是编译好的目标文件,linklibs是要链接的静态及动态库的列表,dllName是最终生成的动态库的名字。
方法二、用g++工具加-shared参数
语法g++ -shared linkobj1 linkobj2 ... linklibs -o dllName
其中参数意义与方法一中同名参数相同。......
M4宏处理器(2009-07-30 22:24:00)
摘要:原文:http://cm.bell-labs.com/7thEdMan/vol2/m4
转自:http://blog.chinaunix.net/u/13392/showart_135427.html
摘要
M4 是在 UNIX ® 和 GCOS 上可用的宏处理器。它的主要用途是在无参数宏不够强力的情况下用做 Ratfor 的前端。它也被用于各异的语言如 C 和 Cobol。M4 特别适合于函数式语言如 Fortran、PL/I 和 C,因为宏是以函数表示法指定的。
M4 提供了即使在更大的宏处理器中都少见的特征,它包括了
参数
条件测试
算术功能
字符串和子串函数
文件操纵
本文是 M4 用户手册。
July 1, 1977
介绍
用法
定义宏
引用
参数
算术内置
文件操纵
系统命令
条件
字符串操纵
打印
内置总结
致谢
引用
---- 前言完 ----
介绍
宏处理器是增强一门编程语言,使它更加美味或更加可读,或者把它裁剪得适合特定应用的有用的方式。C 语言中的 #define 语句和 Ratfor 中类似的 define 就是任何宏处理器都提供的基本设施的例子 — 它把文本替代为其他文本。
M4 宏处理器是对叫做 M3 的宏处理器的扩展,它是 D. M. Ritchie 为 AP-3 小型机写的;M3 基于的是为 [1] 实现的宏处理器。不熟悉宏处理基本概念的读者可以读一下其中的某些讨论。
M4 适合于做 Ratfor 和 C 的前端,而且还成功的用于 Cobol。除了直接把一个字符串替代为另一个字符串之外,它还提供带有参数的宏、有条件的宏扩展、算术、文件操纵和某些特 殊的字符串处理函数。
M4 的基本操作把输入复制到输出。但在读入输入的时候,检查每个字母数字(alphanumeric)的“记号”(token) (就是说字母和数字的字符串)。如果它是一个宏的名字,则把这个宏的名字替代为它所定义的文本,把结果的字符串压回到输入中被重新扫描。调用宏可以带有参 数,在这种情况下,参数被收集并在重新扫描之前替换入定义的文本中正确的位置上。
M4 提供了一组大约二十个内置宏来进行各种有用的操作;此外,用户可以定义新宏。......
正余弦定理与三角形面积公式(2009-07-07 16:45:00)
摘要:这两天在看代码时发现关于三角形的这些基本定理和公式很有用,所以从网上搜了下,主要有三角形的正弦定理,余弦定理,以及三角形面积公式(包括海伦公式)。
正弦定理(引自百度百科)
Sine theorem
在一个三角形中,各边和它所对角的正弦的比相等。
即a/sinA=b/sinB=c/sinC=2R(2R在同一个三角形中是恒量,是此三角形外接圆的半径的两倍)
这一定理对于任意三角形ABC,都有
a/sinA=b/sinB=c/sinC=2R
R为三角形外接圆半径
证明 步骤1.
在锐角△ABC中,设BC=a,AC=b,AB=c。作CH⊥AB垂足为点H
CH=a·sinB
CH=b·sinA
∴a·sinB=b·sinA
得到
a/sinA=b/sinB
同理,在△ABC中,
b/sinB=c/sinC
步骤2.
证明a/sinA=b/sinB=c/sinC=2R:
如图,任意三角形ABC,作ABC的外接圆O.
作直径BD交⊙O于D.
连接DA.
因为直径所对的圆周角是直角,所以∠DAB=90度
因为同弧所对的圆周角相等,所以∠D等于∠C.
所以c/sinC=c/sinD=BD=2R
类似可证其余两个等式。
意义 正弦定理指出了任意三角形中三条边与对应角的正弦之间的一个关系式,又由正弦函数在区间上的单
调性可知,正弦定理非常好的描述了任意三角形中边与角的一种数量关系。
余弦定理
余弦定理是揭示三角形边角关系的重要定理,直接运用它可解决一类已知三角形两边及夹角求第三边或者是已知三个边求角的问题,若对余弦定理加以变形并适当移于其它知识,则使用起来更为方便、灵活。
对于任意三角形 三边为a,b,c 三角为A,B,C 满足性质
(注:a*b、a*c就是a乘b、a乘c 。a^2、b^2、c^2就是a的平方,b的平方,c的平方。)
a^2=b^2+c^......
组合,关联,聚合的区别(2009-07-01 09:05:00)
摘要:类间关系
在类图中,除了需要描述单独的类的名称、属性和操作外,我们还需要描述类之间的联系,因为没有类是单独存在的,它们通常需要和别的类协作,创造比单独工作更大的语义。在UML类图中,关系用类框之间的连线来表示,连线上和连线端头处的不同修饰符表示不同的关系。类之间的关系有继承(泛化)、关联、聚合和组合。
(1)继承:指的是一个类(称为子类)继承另外的一个类(称为基类)的功能,并增加它自己的新功能的能力,继承是类与类之间最常见的关系。类图中继承的表示方法是从子类拉出一条闭合的、单键头(或三角形)的实线指向基类。例如,图3.2给出了MFC中 CObject类和菜单类CMenu的继承关系。
图3.2 类的继承
类的继承在C++中呈现为:
class B { }
class A : public B{ }
(2)关联:指的是模型元素之间的一种语义联系,是类之间的一种很弱的联系。关联可以有方向,可以是单向关联,也可以是双向关联。可以给关联加上关联名来描述关联的作用。关联两端的类也可以以某种角色参与关联,角色可以具有多重性,表示可以有多少个对象参与关联。可以通过关联类进一步描述关联的属性、操作以及其他信息。关联类通过一条虚线与关联连接。对于关联可以加上一些约束,以加强关联的含义。
关联在C++中呈现为:
class A{...}
class B{ ...}
A::Function1(B &b) //或A::Function1(B b) //或A::Function1(B *b)
即一个类作为另一个类方法的参数。
(3)聚合:指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。
(4)组合:也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。
聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较......
编译OSspecific时碰到的编译问题(2009-03-23 18:16:00)
摘要:在对OSspecific静态链接库进行编译时出现下列问题:
程序中的string.H与系统头文件string.H的冲突:
程序中的string.H位于../../src/OpenFOAM/lnInclude中,而系统的string.H位于 MingW\include中,在CodeBlocks工程文件中只定义了两个搜索路径即../../src/OpenFOAM/lnInclude和../../src/OSspecific/lnInclude,这样的话在进行编译时的编译过程出错:
In file included from C:/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/char_traits.h:45,
from C:/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/string:47,
from ../../src/OpenFOAM/lnInclude/..\primitives\strings\string\string.H:51,
from ../../src/OpenFOAM/lnInclude/string.H:1,
from ../../......
[转]undefined reference to vtable(2009-03-18 20:56:00)
摘要:最近在写一套基础类库用于SG解包blob字段统计,在写完了所有程序编译时遇到一个郁闷无比的错误:
MailBox.o(.text+0x124): In function `CMailBox::CMailBox[not-in-charge](CMmogAnalyseStatManager*)':
../src/MailBox.cpp:27: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()'
MailBox.o(.text+0x182): In function `CMailBox::CMailBox[in-charge](CMmogAnalyseStatManager*)':
../src/MailBox.cpp:27: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()'
MailBox.o(.gnu.linkonce.t._ZN8CMailBoxD1Ev+0x33): In function `CMailBox::~CMailBox [in-charge]()':
../include/MailBox.hpp:22: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()'
MailBox.o(.gnu.linkonce.t._ZN8CMailBoxD1Ev+0x4f):../include/MailBox.hpp:22: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()'
MailBox.o(.gnu.linkonce.t._ZN8CMailBoxD0Ev+0x33): In function `CMailBox::~CMailBox [in-charge deleting]()':
../include/MailBox.hpp:22: undefi......
[c、c++]宏中"#"和"##"的用法(2009-02-01 09:41:00)
摘要:宏中"#"和"##"的用法
一、一般用法
我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.
用法:
#include<cstdio>
#include<climits>
using namespace std;
#define STR(s) #s
#define CONS(a,b) int(a##e##b)
int main()
{
printf(STR(vck)); // 输出字符串"vck"
printf("%d\n", CONS(2,3)); // 2e3 输出:2000
return 0;
}
二、当宏参数是另一个宏的时候
需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开.
1, 非'#'和'##'的情况
#define TOW (2)
#define MUL(a,b) (a*b)
printf("%d*%d=%d\n", TOW, TOW, MUL(TOW,TOW));
这行的宏会被展开为:
printf("%d*%d=%d\n", (2), (2), ((2)*(2)));
MUL里的参数TOW会被展开为(2).
2, 当有'#'或'##'的时候
#define A (2)
#define STR(s) #s
#define CONS(a,b) int(a##e##b)
printf("int max: %s\n", STR(INT_MAX)); // INT_MAX ......
runtimeSelctionTable宏(2009-02-01 08:32:00)
摘要:简单介绍:
在头文件runTimeSelectionTables.H中声明了两个很重要的宏:
declareRunTimeSelctionTable(autoPtr, baseType, argNames, argList, parList)
defineRunTimeSelectionTable(baseType, argNames)
这里涉及到一个专业词汇 ”run-time selection table”, 这两个宏的定义就是为了方便实现run-time selection table.
首先要说明的是这两个宏是成对的,也就是在源代码文件中这两个宏也要成对使用,一般将第一个宏放在头文件中,而第二个宏放在相应的c文件中。一个为声明另一个是定义实现。
详细描述
Ø declareRunTimeSelectionTable
该宏具有5个参数:autoPtr,baseType,argNames,argList,parList。
首先,利用typedef定义一个函数指针类型 argNamesConstructorPtr,返回值为autoPtr<baseType>,参数为argList;
接着,利用该函数指针通过typedef定义一个HashTable类型:argNamesConstructorTable,该HashTable的模板参数分别为<argNamesConstructorPtr, word, string::hash>;
接着,定一个静态argNamesConstructorTable型的指针变量:argnamesConstructorTablePtr_;
定义一个模板类:addargNamesConstructorToTable,模板参数为baseTypeType,该类中一个静态成员函数New,一个构造函数和一个析构函数。New的参数列表为argList,返回值是autoPtr<baseType>,实际上是调用autoPtr<baseType> (new baseTypeType parList)。构造函数有一个参数(const word& lookup=......
在论坛里回复别人关于链表操作的帖子(2008-11-29 13:15:00)
摘要:#include<iostream>
using namespace std;
struct Node
{
double content;
Node* next;
Node():content(0.0),next(NULL){}//默认构造函数
Node(double c,Node* n):content(c),next(n){}//又一构造函数
};
void clearList(Node* h)//链表内存回收
{
if(h)
{
if(h ->next)
{
Node* nextHead= h ->next;
delete h;
clearList(nextHead);
}
else
{
&n......