类的定义和使用

转自:http://mrmzy.bokee.com/tb.b?diaryId=15467469

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Label5: TLabel;
    Edit5: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label6: TLabel;
    Label7: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

var
Form1: TForm1;
type
    Tstudent=class
    private
      name:string;
      yy:real;
      math:real;
      hx:real;
      total:real;
    public
      procedure getname(nm:string);virtual;
      procedure getyy(cj:real);virtual;
      procedure getmt(cj:real);virtual;
      procedure gethx(cj:real);virtual;
      procedure caculat();virtual;
      function returntotal():real;virtual;
end;

implementation

function Tstudent.returntotal():real;
begin
returntotal:=total;
end;

procedure Tstudent.getname(nm:string);
begin
if name<>nm then
    name:=nm;
end;

procedure Tstudent.getyy(cj:real);
begin
if yy<>cj then
    yy:=cj;
end;

procedure Tstudent.getmt(cj:real);
begin
if math<>cj then
    math:=cj;
end;

procedure Tstudent.gethx(cj:real);
begin
if hx<>cj then
    hx:=cj;
end;

procedure Tstudent.caculat();
begin
total:=yy+math+hx;
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
student:Tstudent;
begin
if (edit1.Text=”) or (edit2.Text=”) or (edit3.Text=”) or (edit4.Text=”) then
     edit5.Text:=’请检查输入!’
else
     begin
       student:=Tstudent.Create;
       student.getname(edit1.Text);
       student.getyy(strtofloat(edit2.Text));
       student.getmt(strtofloat(edit3.Text));
       student.gethx(strtofloat(edit4.Text));
       student.caculat();
       edit5.Text:=floattostr(student.returntotal());
     end
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
edit1.Text:=”;
edit2.Text:=”;
edit3.Text:=”;
edit4.Text:=”;
edit5.Text:=”;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;

end.

Read: 23

BC++B 可视化组件库VCL中的对象、组件与控件

     图2 – 1为可视组件库的分层结构的简图,图中显示出了树状分层结构的五个主要的分支。

C++ Builder 可视化组件库(VCL)中的对象、组件与控件

2.4.1 TObject分支
     下面几部分分别对包含于五个主要分支中的类做出简要地描述,为完整地说明VCL对象的分层结构,引用了包含于产品中的VCL对象分层结构图。
     所有的VCL对象都派生于TObject,其方法定义了构造、析构、消息处理等基本特征。VCL对象的许多强大的功能都建立在TObject给出的这些方法的基础之上。通过提供下列方法,TObject封装了所有VCL对象最基本的通用特征:
· 在对象被创建或销毁时响应的能力。
· 对象的类型和实例信息,及有关对象发布的属性的运行时类型信息(RTTI)
· 支持消息处理。
     TObject是许多简单类的直接祖先。在这一分支中所包含的类有一个共同的重要的特性,它们都是暂时的。这是指,这些类都没有用来在对象被销毁之前保存状态的方法,它们不是固有的。
     在这一分支中一个较主要的类为异常(Exception)类。它提供一组内嵌的异常类用于自动处理除数为零的错误、文件I/O错误、非法的类型匹配及许多其他的异常情况。
     包含于TObject分支的还有一些封装数据结构的类,例如:
· TBits,存储了一个布尔型“数组”的类。
· TList,链接列表的类。
· TStack ,包含一个“后进先出”的指针数组的类。
· TQueue,包含一个“先进先出”的指针数组的类。
     此外,你还可以发现一些封装了外部对象的类,如TPrinter,它封装了Windows打印机接口,TRegistry,它封装了底层系统注册及其函数。
     TStream是这一分支里其他类型的典型例子。TStream是流对象的基类,可以与如磁盘文件、动态内存等等各种存储介质进行读写操作。
     可以看到,这一分支中包含许多不同类,对于一个开发者来说,这些类都非常有用。

2.4.2 TPersistent分支
     在VCL分层结构中直接在TObject之下的是TPersistent。TPersistent给其下所有的类添加了两个重要的方法: SaveToStream和LoadFromStream。这些方法向对象提供固有特性。例如:当窗体设计器需要创建DFM文件(存储窗体及其组件信息的文件)时,它循环检查窗体的组件数组,并对其中所有的组件都调用SaveToStream方法。每个组件都“知道”如何将改变了的属性写入流中(如文本文件)。反过来,若窗体设计器需要从DFM文件中装入组件属性时,它循环检查窗体的组件数组,并对其中所有的组件都调用LoadFromStream方法。因此,任何TPersistent的派生类都有保存状态信息和需要时还原它们的能力。
     在这一分支中包含的类主要有:
· TGraphicsObject,图形对象的基类,封装了Windows图形对象:TBrush、TFont、TPen。
· TGraphic,图标、位图、图元文件等能存储和显示可视图像的对象的基类,封装了TBitmap、TIcon和TMetaFile。
· TStrings ,串列表对象的基类。
· TClipboard,封装了Windows剪贴板对象,它包含从应用程序中剪下或复制的文本或者图形。
· TCollection、TOwnedCollection和TCollectionItem,包含特殊预定义项的索引集。

2.4.3 TComponent分支
     TComponent是所有VCL组件的共同祖先。组件就是在设计时可在窗体中操纵的对象。虽然名为可视组件库,其实VCL中包含的大部分对象为非可视化的。
     VCL组件都是固有的对象,其功能主要有:
· 可出现在组件面板上并可在窗体设计器中修改。
· 可拥有和管理其他的组件。
· 增强的流及文件管理能力。
· 可通过New Objects对话框中ActiveX页的向导程序转换成ActiveX控件或其他COM对象。
     TComponent 扮演了一个所有组件都可插入的标准“总线”的角色。TComponent通过Name和Owner属性及一些方法规定组件在设计时的行为。所有派生于 TComponent的类都有Name和Owner属性。Owner属性值,也即组件的属主负责该组件对象的销毁。
     在这一分支中包含的类主要有:
· TMainMenu 为窗体提供菜单栏及相应的下拉菜单的类。
· TTimer 包含Windows API 中的计时器函数的类。
· TOpenDialog、TSaveDialog、TFontDialog、TFindDialog、TColorDialog等,是通用Windows对话框类。
· TActionList,包含组件或控件,如菜单项和按钮的动作列表的类。
· TScreen,负责管理应用程序创建的窗体和数据模块,当前的活跃窗体及其上的活跃控件、屏幕尺寸和分辨率,应用程序使用的光标和字体等内容的类。

2.4.4 TControl分支
     所有的控件都是可视化对象,即它们在运行时可见并可被用户操纵。且它们都有作为可视化控件所共有的属性、方法和事件,例如控件的位置、光标、与控件关联的提示、用来描绘或移动控件的方法、用来响应鼠标动作的事件等。
     TComponent定义所有组件的行为,TControl则进一步定义了所有可视化控件的行为。包含画图例程、标准Windows事件及容器特性。
     在这一分支中一组较重要的类为TGraphicControl。TGraphicControl控件类必须能描绘它们自己并且从不接受焦点。在这组控件中主要包含:
· TImage,一种显示图形类图像的控件。
· TLabel,一种在窗体中显示文字的控件。
· TBevel,一种表示边缘斜角的控件。
· TPaintBox,一种提供画布的控件,应用程序能够使用画布创建及生成显示图像。
     注意到这些控件包含通用的画图例程(画图、重画、使无效等),但C++Builder不必为它们分配窗口句柄,因为它们从不需要接受焦点。

2.4.5 TWinControl分支
     TWinControl是为所有的窗口控件的基类。下面的是窗口控件的几个特征:
· 窗口控件是应用程序运行时能接受焦点的控件。
· 也许还有其他控件可以显示数据,但是只有当该控件是一种窗口控件时,用户才能使用键盘来与之交互。
· 窗口控件能包含其他控件。
· 包含其他控件的控件是父代控件。只有窗口控件能够作为一个或多个子控件的父代控件。
· 窗口控件有窗口句柄。
     除了能接受焦点外,TWinControl与TControl基本相同。这意味着它们不但包含许多标准Windows事件,同时Windows还必须给它们分配窗口句柄。这一分支中包含了两大类控件,一种是由Windows自动描绘的(包括TEdit、TListBox、TComboBox、 TPageControl等),另一种是C++Builder自定义的(包括TDBNavigator、TMediaPlayer、TGauge等)。不过,你根本不必关心控件如何描绘它们自己或如何响应事件,这些都已被C++Builder所完全封装。

2.4.6 TControl的共同属性
     所有可视化控件(TControl的后裔)共享的属性包括:
· 位置、尺寸及排列属性。
· 显示属性。
· 父代属性。
· 导航属性。
· 拖放属性。
· 拖动-停靠属性。
· 动作(Action)属性。
     这些属性是从TControl继承而来的,它们都是发布属性,因此,只对于那些适用的组件它们才会出现在对象观察器中。例如:TImage未发布Color属性,因为它的颜色是由它所显示的图形决定的。
     1、Action(动作)属性
     Action可以让一些动作共享代码(例如:当工具栏按钮和菜单项所做的事相同),并且依赖于应用程序的状况,提供了简单的易实现的方法控制动作的有效与否。
· Action指定与控件相关的动作。
· ActionLink包含与控件相关的动作链接对象。
     2、位置、尺寸及排列属性
     这些属性用于定义控件在窗体或容器控件中位置和尺寸:
· Height,设置垂直尺寸。
· Width,设置水平尺寸。
· Top,设置上边界。
· Left,设置左边界。
· AutoSize,指定控件尺寸是否自动地适应其中的内容。
· Align,确定控件在容器(父代控件)内部如何排列。
· Anchor,指定控件相对于其父代控件的定位。
     下列属性确定控件整个客户区的高度、宽度、尺寸:
· ClientHeight,以像素为单位指定控件客户区的高度。
· ClientWidth,以像素为单位指定控件客户区的宽度。
     对于非可视化组件,这些属性都是不可访问的,但是C++Builder记录下了将组件图标放置在窗体的何处。大多数情况下可以通过操纵控件的图像或使用排列面板来设置和改变这些属性,同时,也能在运行时改变它们。

Read: 1993

C++ string(字符串)详解

好了,进入正题………
首先,为了在我们的程序中使用string类型,我们必须包含头文件 。如下:
#i nclude<string> //注意这里不是string.h string.h是C字符串头文件

1.声明一个C++字符串
声明一个字符串变量很简单:
string Str;
这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下:
a)string s;//生成一个空字符串s
b)string s(str) //拷贝构造函数 生成str的复制品
c)string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值
d)string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值
e)string s(cstr) //将C字符串作为s的初值
f)string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。
g)string s(num,c) //生成一个字符串,包含num个c字符
h)string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值
i)s.~string() //销毁所有字符,释放内存
都很简单,我就不解释了。
2.字符串操作函数
这里是C++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。
a) =,assign() //赋以新值
b) swap() //交换两个字符串的内容
c) +=,append(),push_back() //在尾部添加字符
d) insert() //插入字符
e) erase() //删除字符
f) clear() //删除全部字符
g) replace() //替换字符
h) + //串联字符串
i) ==,!=,<,<=,>,>=,compare()//比较字符串
j) size(),length()//返回字符数量
k) max_size() //返回字符的可能最大个数
l) empty()//判断字符串是否为空
m) capacity() //返回重新分配之前的字符容量
n) reserve() //保留一定量内存以容纳一定数量的字符
o) [ ], at() //存取单一字符
p) >>,getline() //从stream读取某值
q) <r) copy() //将某值赋值为一个C_string
s) c_str() //将内容以C_string返回
t) data() //将内容以字符数组形式返回
u) substr() //返回某个子字符串
v)查找函数
w)begin() end() //提供类似STL的迭代器支持
x) rbegin() rend() //逆向迭代器
y) get_allocator() //返回配置器
下面详细介绍:
2.1 C++字符串和C字符串的转换
C+ +提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy(),其中,data()以字符数组的形式返回字符串内容,但并不添加’’。c_str()返回一个以‘’结尾的字符数组,而copy()则把字符串的内容复制或写入既有的c_string或字符数组内。C++字符串并不以’’结尾。我的建议是在程序中能使用C++字符串就使用,除非万不得已不选用c_string。由于只是简单介绍,详细介绍掠过,谁想进一步了解使用中的注意事项可以给我留言(到我的收件箱)。我详细解释。
2.2 大小和容量函数
一个C++字符串存在三种大小:a) 现有的字符数,函数是size()和length(),他们等效。Empty()用来检查字符串是否为空。b)max_size() 这个大小是指当前C++字符串最多能包含的字符数,很可能和机器本身的限制或者字符串所在位置连续内存的大小有关系。我们一般情况下不用关心他,应该大小足够我们用的。但是不够用的话,会抛出length_error异常c)capacity()重新分配内存之前 string所能包含的最大字符数。这里另一个需要指出的是reserve()函数,这个函数为string重新分配内存。重新分配的大小由其参数决定,默认参数为0,这时候会对string进行非强制性缩减。

还有必要再重复一下C++字符串和C字符串转换的问题,许多人会遇到这样的问题,自己做的程序要调用别人的函数、类什么的(比如数据库连接函数 Connect(char*,char*)),但别人的函数参数用的是char*形式的,而我们知道,c_str()、data()返回的字符数组由该字符串拥有,所以是一种const char*,要想作为上面提及的函数的参数,还必须拷贝到一个char*,而我们的原则是能不使用C字符串就不使用。那么,这时候我们的处理方式是:如果此函数对参数(也就是char*)的内容不修改的话,我们可以这样Connect((char*)UserID.c_str(), (char*)PassWD.c_str()),但是这时候是存在危险的,因为这样转换后的字符串其实是可以修改的(有兴趣地可以自己试一试),所以我强调除非函数调用的时候不对参数进行修改,否则必须拷贝到一个char*上去。当然,更稳妥的办法是无论什么情况都拷贝到一个char*上去。同时我们也祈祷现在仍然使用C字符串进行编程的高手们(说他们是高手一点儿也不为过,也许在我们还穿开裆裤的时候他们就开始编程了,哈哈…)写的函数都比较规范,那样我们就不必进行强制转换了。

2.3元素存取
我们可以使用下标操作符[]和函数at()对元素包含的字符进行访问。但是应该注意的是操作符[]并不检查索引是否有效(有效索引0~str.length()),如果索引失效,会引起未定义的行为。而at()会检查,如果使用at()的时候索引无效,会抛出 out_of_range异常。
有一个例外不得不说,const string a;的操作符[]对索引值是a.length()仍然有效,其返回值是’’。其他的各种情况,a.length()索引都是无效的。举例如下:
const string Cstr(“const string”);
string Str(“string”);

Str[3];//ok
Str.at(3);//ok

Str[100]; //未定义的行为
Str.at(100);//throw out_of_range

Str[Str.length()]//未定义行为
Cstr[Cstr.length()] //返回 ‘’
Str.at(Str.length());//throw out_of_range
Cstr.at(Cstr.length()) ////throw out_of_range

我不赞成类似于下面的引用或指针赋值:
char& r=s[2];
char* p= &s[3];
因为一旦发生重新分配,r,p立即失效。避免的方法就是不使用。

2.4比较函数
C++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C -string的比较(如 str<”hello”)。在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得比较。字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。同时,string (“aaaa”) 另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。他返回一个整数来表示比较结果,返回值意义如下:0-相等 〉0-大于 <0-小于。举例如下:
string s(“abcd”);

s.compare(“abcd”); //返回0
s.compare(“dcba”); //返回一个小于0的值
s.compare(“ab”); //返回大于0的值

s.compare(s); //相等
s.compare(0,2,s,2,2); //用”ab”和”cd”进行比较 小于零
s.compare(1,2,”bcx”,2); //用”bc”和”bc”比较。
怎么样?功能够全的吧!什么?还不能满足你的胃口?好吧,那等着,后面有更个性化的比较算法。先给个提示,使用的是STL的比较算法。什么?对STL一窍不通?靠,你重修吧!

2.5 更改内容
这在字符串的操作中占了很大一部分。
首先讲赋值,第一个赋值方法当然是使用操作符=,新值可以是string(如:s=ns) 、c_string(如:s=”gaint”)甚至单一字符(如:s=’j’)。还可以使用成员函数assign(),这个成员函数可以使你更灵活的对字符串赋值。还是举例说明吧:
s.assign(str); //不说
s.assign(str,1,3);//如果str是”iamangel” 就是把”ama”赋给字符串
s.assign(str,2,string::npos);//把字符串str从索引值2开始到结尾赋给s
s.assign(“gaint”); //不说
s.assign(“nico”,5);//把’n’ ‘I’ ‘c’ ‘o’ ‘’赋给字符串
s.assign(5,’x’);//把五个x赋给字符串
把字符串清空的方法有三个:s=””;s.clear();s.erase();(我越来越觉得举例比说话让别人容易懂!)。
string提供了很多函数用于插入(insert)、删除(erase)、替换(replace)、增加字符。
先说增加字符(这里说的增加是在尾巴上),函数有 +=、append()、push_back()。举例如下:
s+=str;//加个字符串
s+=”my name is jiayp”;//加个C字符串
s+=’a’;//加个字符

s.append(str);
s.append(str,1,3);//不解释了 同前面的函数参数assign的解释
s.append(str,2,string::npos)//不解释了

s.append(“my name is jiayp”);
s.append(“nico”,5);
s.append(5,’x’);

s.push_back(‘a’);//这个函数只能增加单个字符 对STL熟悉的理解起来很简单

也许你需要在string中间的某个位置插入字符串,这时候你可以用insert()函数,这个函数需要你指定一个安插位置的索引,被插入的字符串将放在这个索引的后面。
s.insert(0,”my name”);
s.insert(1,str);
这种形式的insert()函数不支持传入单个字符,这时的单个字符必须写成字符串形式(让人恶心)。既然你觉得恶心,那就不得不继续读下面一段话:为了插入单个字符,insert()函数提供了两个对插入单个字符操作的重载函数:insert(size_type index,size_type num,chart c)和insert(iterator pos,size_type num,chart c)。其中size_type是无符号整数,iterator是char*,所以,你这么调用insert函数是不行的:insert(0,1, ’j’);这时候第一个参数将转换成哪一个呢?所以你必须这么写:insert((string::size_type)0,1,’j’)!第二种形式指出了使用迭代器安插字符的形式,在后面会提及。顺便提一下,string有很多操作是使用STL的迭代器的,他也尽量做得和STL靠近。
删除函数erase()的形式也有好几种(真烦!),替换函数replace()也有好几个。举例吧:
string s=”il8n”;
s.replace(1,2,”nternationalizatio”);//从索引1开始的2个替换成后面的C_string
s.erase(13);//从索引13开始往后全删除
s.erase(7,5);//从索引7开始往后删5个

2.6提取子串和字符串连接

题取子串的函数是:substr(),形式如下:
s.substr();//返回s的全部内容
s.substr(11);//从索引11往后的子串
s.substr(5,6);//从索引5开始6个字符
把两个字符串结合起来的函数是+。(谁不明白请致电120)

2.7输入输出操作
1.>> 从输入流读取一个string。
2.<< 把一个string写入输出流。
另一个函数就是getline(),他从输入流读取一行内容,直到遇到分行符或到了文件尾。

2.8搜索与查找
查找函数很多,功能也很强大,包括了:
find()
rfind()
find_first_of()
find_last_of()
find_first_not_of()
find_last_not_of()
这些函数返回符合搜索条件的字符区间内的第一个字符的索引,没找到目标就返回npos。所有的函数的参数说明如下:
第一个参数是被搜寻的对象。第二个参数(可有可无)指出string内的搜寻起点索引,第三个参数(可有可无)指出搜寻的字符个数。比较简单,不多说 不理解的可以向我提出,我再仔细的解答。当然,更加强大的STL搜寻在后面会有提及。
最后再说说npos的含义,string::npos的类型是string::size_type,所以,一旦需要把一个索引与npos相比,这个索引值必须是string::size)type类型的,更多的情况下,我们可以直接把函数和npos进行比较(如:if(s.find(“jia”)== string::npos))。

Read: 661

VCL库函数

//—————————– Suntenghe 整理——————–
1.内存分配
2.文件操作
3.磁盘目录管理
4.字符串操作
5.类型转换
6.时间和日期管理

一.BORLAND C++ BUILDER VCL的内存管理函数
1. AllocMem
在队中分配指定字节的内存块,并将分配的每一个字节初始化为 0.函数原型如下:
void * __fastcall AllocMem(Cardinal Size);
2. SysFreeMem
释放所指定的内存块.函数原型如下:
int __fastcall SysFreeMem(void * P);
3. SysReallocMem
要求重新分配参数Size所指定的内存.函数原型如下:
void * __fastcall SysReallocMem(void * P , int Size);

二.Borland C++ Builder VCL的文件操作函数
1. FileOpen
打开指定的文件,如果返回为正数,表示操作成功,返回值为文件句柄:如果返回值为-1,表
示操作失败,函数原型如下:
int __fastcall FileOpen(const System::AnsiString FileName,int Mode);
2. FileCreate
以指定的文件名称创建一个新的文件,如果返回为正数,表示操作成功,返回值为文件句柄,
如果返回值为-1,表示操作失败.函数原型如下:
int __fastcall FileCreate(const System ::AnsiString FileName);
3. FileRead
从文件中读取指定字节的数据到缓冲区中,函数返回实际读取的字节数,函数原型如下;
int __fastcall FileRead(int Handle,void *Buffer,int Count);
4. FileWrite
将缓冲区的数据写入到指定的文件的当前位置中去如果操作成功,函数返回实际写入的字
节数,如果返回为-1,则表示操作产生错误,函数原型如下:
int __fastcall FileWrite(int Handle,const void *Buffer,int Count);
5. FileSeek
调整文件指针到新的位置,如果操作成功,则返回新的文件位置,如果操作失败,则函数返
回-1,函数原型如下:
int __fastcall FileSeek(int Handle,int Offset,int Origin);
6. FileClose
关闭指定的文件,函数原型如下:
void __fastcall FileClose(int Handle);
7. FileAge
返回指定文件的时间标签,如果操作失败,则返回-1,函数原型如下:
int __fastcall FileAge(const System::AnsiString FileName);
8. FileExists
用于测试指定的文件是否存在,如果存在返回真,否则返回假,函数原型如下:
bool __fastcall FileExists(const System::AnsiString FileName);
9. FileGetDate
返回指定文件的DOS时间标签,如果操作失败,则近回-1,函数原型如下:
int __fastcall FileGetDate(int Handle);
10.FileSetDate
更改指定文件的DOS时间标签,如果操作成功,返回0,否则返回错误代码,函数原型如下:
int __fastcall FileSetDate(int Handle,int Age);
11.FileGetAttr
返回指定文件的属性,如果操作失败,则函数返回-1,函数原型如下;
int __fastcall FileGetAttr(const System::AnsiString FileName);
12.FileSetAttr
更改指定文件的属性参数,如果操作成功,则返回0,函数原型如下;
int __fastcall FileSetAttr(const System::AnsiString FileName,int Attr);
13.FindFirst
在指定的文件目录内,搜寻符合特定属性参数的文件,如果成功地查找到符合条件的文件,
则函数返回0,否则函数返回一个错误代码,函数原型如下:
int __fastcall FindFirst(const System::AnsiString Path,int Attr,TSearchRec %26amp;F);
14.FindNext
继续搜寻FindFirst所指定属性参数的文件,如果成功地查找到符合条件的文件,则函数返
回0,否则函数返回一个错误代码,函数原型如下:
int __fastcall FindNext(TSearchRec %26amp;F);
15.FindClose
释放FindFirst操作所申请的内存资源,函数原型如下:
void __fastcall FindClose(TSearchRec %26amp;F);
16.DeleteFile
在计算机磁盘中删除指定的文件,如果操作成功,则函数返回真,函数原型如下:
bool __fastcall DeleteFile(const AnsiString FileName);
17.RenameFile
更改指定文件的名称,如果操作成功,则函数返回真,函数原型如下:
bool __fastcall RenameFile(const AnsiString OldName, const AnsiString NewName);
18.ChangeFileExt
更改指定文件的扩展名,函数原型如下:
AnsiString __fastcall ChangeFileExt(const AnsiString FileName,const AnsiString Extension);
19.ExtractFilePath
返回指定文件的工作路径,函数原型如下:
AnsiString __fastcall ExtractFilePath(const AnsiString FileName);
20.ExtractFileDir
返回指定文件的工作目录,函数原型如下:
AnsiString __fastcall ExtractFileDir(const AnsiString FileName);
21.ExtractFileDrive
返回指定文件的驱动器,函数原型如下:
AnsiString __fastcall ExtractFileDrive(const AnsiString FileName);
22.ExtractFileName
返回指定文件的文件名及扩展名,函数原型如下:
AnsiString __fastcall ExtractFileName(const AnsiString FileName);
23.ExtractFileExt
返回指定文件的扩展名,函数原型如下:
AnsiString __fastcall ExtractFileExt(const AnsiString FileName);

三,Borland C++ Builder VCL的磁盘管理函数
1. DiskFree
返回指定磁盘的剩余空间,如果操作成功,返回剩余磁盘空间,如果操作失败,则返回-1,
函数原型如下:
int __fastcall DiskFree(Byte Drive);
2. DiskSize
返回指定磁盘的空间,如果操作成功,返回磁盘空间,如果操作失败,则返回-1,函数原型如下:
int __fastcall DiskSize(Byte Drive);
3. GetCurrentDir
返回当前工作目录,函数原型如下:
AnsiString __fastcall GetCurrentDir();
4. SetCurrentDir
设置当前工作目录,如果操作成功,则返回真,函数原型如下:
bool __fastcall SetCurrentDir(const AnsiString Dir);
5. CreateDir
创建新的目录,如果操作成功,返回真,否则返回假,函数原型如下:
bool __fastcall CreateDir(const AnsiString Dir);
6. RemoveDir
删除指定的目录,如果操作成功,返回真,否则返回假,函数原型如下:
bool __fastcall RemoveDir(const AnsiString Dir);

四.Borland C++ Builder VCL的字符串函数
1. UpperCase
将指定的AnsiString字符串转换为大写形式,函数原型如下:
AnsiString __fastcall UpperCase(const AnsiString S);
2. LowerCase
将指定的AnsiString字符串转换为小写形式,函数原型如下:
AnsiString __fastcall LowerCase(const AnsiString S);
3. CompareStr
比较两个AnsiString字符串,函数原型如下:
int __fastcall CompareStr(const AnsiString S1, const AnsiString S2);
4. CompareText
比较两个AnsiString字符串,函数原型如下:
int __fastcall CompareText(const AnsiString S1, const AnsiString S2);
5. StrLen
返回字符串的长度,函数原型如下:
Cardinal __fastcall StrLen(const char * Str);
6. StrEnd
返回字符串结尾指针,函数原型如下:
char * __fastcall StrEnd(const char * Str);
7. StrMove
从源字符串向目的字符串拷贝指定数目的字符,函数原型如下:
char * __fastcall StrMove(char * Dest, const char * Source, Cardinal Count);
8. StrCopy
将源字符串拷贝到目的字符串中,函数原型如下:
char * __fastcall StrCopy(char * Dest, const char * Source);
9. StrECopy
将源字符串拷贝到目的字符串中,并返回目的字符串结尾指针,函数原型如下:
char * __fastcall StrECopy(char * Dest, const char * Source);
10.StrLCopy
将源字符串指定数目的字符拷贝到目的字符串中,并返回目的字符串指针,函数原型如下:
char * __fastcall StrLCopy(char * Dest, const char * Source, Cardinal MaxLen);
11.StrPCopy
将AnsiString类型的源字符串拷贝到目的字符串中,并返回目的字符串指针,函数原型如下:
char * __fastcall StrPCopy(char * Dest, const AnsiString Source);
12.StrPLCopy
将源字符串(AnsiString类型)指定数目的字符拷贝到目的字符串中,并返回目的字符串
指针,函数原型如下:
char * __fastcall StrPLCopy(char * Dest, const AnsiString Source, Cardinal MaxLen);
13.StrCat
连接两个字符串,并返回目的字符串指针,函数原型如下:
char * __fastcall StrCat(char * Dest, const char * Source);
14.StrLCat
将指定数目的源字符串连接到目的字符串,并返回目的字符串指针,函数原型如下:
char * __fastcall StrLCat(char * Dest, const char * Source, Cardinal MaxLen);
15.StrComp
两个字符串相到比较,返回比较的结果,函数原型如下:
int __fastcall StrComp(const char * Str1, const char * Str2);
16.StrIComp
两个字符串相互比较(不论大小写),返回比较的结果,函数原型如下:
int __fastcall StrIComp(const char * Str1, const char * Str2);
17.StrLComp
对两个字符串指定数目的字符进行比较操作,函数原型如下:
int __fastcall StrLComp(const char * Str1, const char * Str2, Cardinal MaxLen);
18.StrScan
在指定的字符串中寻找特定的字符,并返回字符串中第一个特定字符的指针,函数原型如下:
char * __fastcall StrScan(const char * Str, char Chr);
19.StrRScan
在指定的字符串中寻找特定的字符,并返回字符串中最后一个特定字符的指针,函数原型
如下:
char * __fastcall StrRScan(const char * Str, char Chr);
20.StrPos
在Strl所指定的字符串中寻找Str2所指定的子字符串,并返回Str2在Str2中第一个子字符的
指针,函数原型如下:
char * __fastcall StrPos(const char * Str1, const char * Str2);
21.StrUpper
将字符串转换为大写形式,函数原型如下:
char * __fastcall StrUpper(char * Str);
22.StrLower
将字符串转换为小写形式,函数原型如下:
char * __fastcall StrLower(char * Str);
23.StrPas
将指定的字符串转换为AnsiString类型字符串对象,函数原型如下:
AnsiString __fastcall StrPas(const char * Str);
24.StrAlloc
为字符串分配指定字节的内存,并返回内存指针,函数原型如下:
char * __fastcall StrAlloc(Cardinal Size);
25.StrBufSize
返回*Str所指向内存的大小,函数原型如下:
Cardinal __fastcall StrBufSize(const char * Str);
26.StrNew
在堆中为指定字符串分配空间,并将字符串拷贝到此空间中,函数原型如下:
char * __fastcall StrNew(const char * Str);

五.Borland C++ Builder VCL的数值转换函数
1. IntToStr
将整数转换为AnsiString字符串,函数原型如下:
AnsiString __fastcall IntToStr(int Value);
2. IntToHex
将整数转换为十六进制字符串,函数原型如下:
AnsiString __fastcall IntToHex(int Value, int Digits);
3. StrToInt
将AnsiString字符串转换为整数值,如果不能进行转换,则产生EConvertError异常,
函数原型如下:
int __fastcall StrToInt(const AnsiString S);
4. StrToIntDef
将AnsiString字符串转换为一个数值,函数原型如下:
int __fastcall StrToIntDef(const System::AnsiString S,int Default);
5. FloatToStr
将浮点数转换为AnsiString字符串,函数原型如下:
AnsiString __fastcall FloatToStr(Extended Value);
6. StrToFloat
将AnsiString字符串转换为一个浮点数值,函数原型如下:
Extended __fastcall StrToFloat(const AnsiString S);
7. FloatToStrF
将浮点数转换为指定格式的AnsiString字符串,函数原型如下:
AnsiString __fastcall FloatToStrF(Extended Value, TFloatFormat Format,int Precision, int Digits);

六.Borland C++ Builder VCL的时间函数
1. Date
返回TDateTime对象,包含当前的年月日信息,函数原型如下:
System::TDateTime __fastcall Date(void);
2. Time
返回TDateTime对象,包含当前的时间信息,函数原型如下:
System::TDateTime __fastcall Time(void);
3. Now
返回TDateTime对象,获取当前的日期和时间信息,函数原型如下:
System::TDateTime __fastcall Now(void);
4. DatetimeToString
将TDateTime对象转换为指定格式的字符串对象,函数原型如下:
void __fastcall DateTimeToString(AnsiString %26amp;Result, const AnsiString Format,System::TDateTime DateTime);
5. DateToStr
将TDateTime对象(包含当前年月日信息)转换为字符串对象,函数原型如下:
AnsiString __fastcall DateToStr(System::TDateTime Date);
6. TimeToStr
将当前日期转换为字符串对象,函数原型如下:
AnsiString __fastcall TimeToStr(System::TDateTime Time);
7. DateTimetoStr
将TDateTime对象转换为字符串对象,函数原型如下:
AnsiString __fastcall DateTimeToStr(System::TDateTime DateTime);
8. StrToDate
将字符串对象转换为年月日对象,函数原型如下:
System::TDateTime __fastcall StrToDate(const AnsiString S);
9. StrToTime
将字符串对象转换时间对象,函数原型如下:
System::TDateTime __fastcall StrToTime(const AnsiString S);
10.StrToDateTime
将字符串对象转换为年月日时间对象,函数原型如下:
System::TDateTime __fastcall StrToDateTime(const AnsiString S);
11.DateTimeToSystemTime
将TDateTime对象转换为操作系统时间,函数原型如下:
void __fastcall DateTimeToSystemTime(System::TDateTime DateTime, _SYSTEMTIME %26amp;SystemTime);
12.SystemTimeToDateTime
将操作系统时间转换为TDateTime对象,函数原型如下:
System::TDateTime __fastcall SystemTimeToDateTime(const _SYSTEMTIME %26amp;SystemTime);

// ———————– tantalus@mail.777.net.cn———————-

Read: 668

GCC编译器选项及优化提示

大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。
如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。

一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。
一些源码包比如binutils, gcc, glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了!

另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。大多数configure脚本会使用这两个环境变量代替Makefile文件中的值。
但是少数configure脚本并不这样做,他们必须需要手动编辑才行。

为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值):
export CFLAGS="-O3 -march=" && CXXFLAGS=$CFLAGS
这是一个确保能够在几乎所有平台上都能正常工作的最小设置。

"-march"选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行),
Intel通常是:pentium2, pentium3, pentium3m, pentium4, pentium4m, pentium-m, prescott, nocona
说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的cpu;
prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋)
AMD通常是:k6, k6-2, k6-3, athlon, athlon-tbird, athlon-xp, athlon-mp, opteron, athlon64, athlon-fx
用AMD的一般都是DIYer,就不必解释了吧。

如果编译时没有抱怨"segmentation fault, core dumped",那么你设定的"-O"优化参数一般就没什么问题。
否则请降低优化级别("-O3" -> "-O2" -> "-O1" -> 取消)。
个人意见:服务器使用"-O2"就可以了,它是最安全的优化参数(集合);桌面可以使用"-O3" ;
不鼓励使用过多的自定义优化选项,其实他们之间没什么明显的速度差异(有时"-O3"反而更慢)。

编译器对硬件非常敏感,特别是在使用较高的优化级别的时候,一丁点的内存错误都可能导致致命的失败。
所以在编译时请千万不要超频你的电脑(我编译关键程序时总是先降频然的)。

注意:选项的顺序很重要,如果有两个选项互相冲突,则以后一个为准。
比如"-O3"将打开-finline-functions选项,但是可以用"-O3 -fno-inline-functions"既使用-O3的功能又关闭函数内嵌功能。

更多的优化选项请参见:
http://gcc.gnu.org/onlinedocs/gcc-3….e-Options.html
http://gcc.gnu.org/onlinedocs/gcc-3….4-Options.html
http://gcc.gnu.org/onlinedocs/gcc-4….e-Options.html
http://gcc.gnu.org/onlinedocs/gcc-4….4-Options.html
所有GCC选项完整列表参见:
http://gcc.gnu.org/onlinedocs/gcc-3….n-Summary.html
http://gcc.gnu.org/onlinedocs/gcc-4….n-Summary.html

有两个页面值的参考:
(对于gentoo-1.4)比较安全的优化选项
http://www.freehackers.org/gentoo/gc…flag_gcc3.html
(对于gentoo-1.4)进阶优化选项
http://www.freehackers.org/gentoo/gc…g_gcc3opt.html

*******************************************************************

哦,忘了说一声,"-O2"已经启用绝大多数安全的优化选项了,所以其实你不必对那一堆选项发愁。
先说说"-O3"在"-O2"基础上增加的几项,你可以按需添加(还算比较安全):
[gcc-3.4.4]
-finline-functions 允许编译器选择某些简单的函数在其被调用处展开
-fweb 为每个web结构体分配一个伪寄存器
-frename-registers 试图驱除代码中的假依赖关系,这个选项对具有大量寄存器的机器很有效。
[gcc-4.0.2]
-finline-functions 说明如上
-funswitch-loops 将循环体中不改变值的变量移动到循环体之外
-fgcse-after-reload **不太明白它的含义**[哪位大峡知道给小弟讲解一下,先行谢过 ]

说完"-O3"再说说在嵌入式系统上常用的"-Os"选项,这个选项其实也很重要,它的含义是对生成的二进制代码进行尺寸上的优化,它打开了所有"- O2"打开的选项,因此通常认为的"-Os"生成的二进制代码执行效率低的潜在意识是错误的!当然该选项与"-O2"的不同之处在于它在"-O2"的基础上禁止了所有为了对齐而插入的空间,也就是将所有"-falign-*"系列的选项禁用了。这种禁用究竟是否一定降低了代码的执行效率,依据程序的不同而不同,据说某些情况下"-Os"的效率比"-O3"还要高14%!请兄弟们在实践中自己摸索吧…

———————————————

下面选择我认为比较重要的几项简单介绍一下[gcc-3.4.4],GCC选项完整列表太长了!精力有限。
[注意]这里列出的都是非默认的选项,你只需要添加你所需要的选项即可

-w 禁止输出警告消息

-Werror 将所有警告转换为错误

-Wall 显示所有的警告消息

-v 显示编译程序的当前版本号

-V 指定gcc将要运行的版本。只有在安装了多个版本gcc的机器上才有效。

-ansi 按照ANSI标准编译程序,但并不限制与标准并不冲突的GNU扩展(一般不用该选项)

-pedantic 如果要限制代码必须严格符合ISO标准,就在"-ansi"的基础上同时启用这个选项(很少使用)

-std= 指定C语言的标准(c89,c99,gnu89),该选项禁止了GNU C的扩展关键字asm,typeof,inline (一般不用该选项)

-static 连接器将忽略动态连接库,同时通过将静态目标文件直接包含到结果目标文件完成对所有引用的解析。

-shared 连接器将生成共享目标代码,该共享库可在运行时动态连接到程序形成完整的可执行体。
如果使用gcc命令创建共享库作为其输出,该选项可以防止连接器将缺失main()方法视为错误。
为了可以正确的工作,应该一致的使用选项"-fpic"以及目标平台选项编译构成同一个库的所有共享目标模块。

-shared-libgcc 该选项指定使用共享版本的libgcc,在没有共享版本的libgcc的机器上该选项无效。

-specs= gcc驱动程序读取该文件以确定哪些选项应该传递给那些子进程。
该选项可以通过指定配置文件来覆盖默认配置,指定的文件将在默认配置文件读取后进行处理以修改默认配置。

-pipe 使用管道而不是临时文件一个阶段到另一个阶段交换输出的方式,可以加快编译速度。建议使用。

-o 指定输出文件,对各种输出皆有效。由于只能指定一个文件,所以在产生多个输出文件的情况下不要使用该选项。

–help 显示gcc的命令行选项列表;与"-v"一起使用时还将显示gcc调用的各个进程所接受的选项。

–target-help 显示目标机器相关的命令行选项列表

-b 指示需要编译程序的目标机器;默认为编译程序所运行的目标机编译代码。
目标机通过指定包含编译程序的目录来确定,通常为/usr/local/lib/gcc-lib//

-B 指定库文件的位置,包括编译程序的文件、执行程序和数据文件,如果需要运行子程序(如cpp,as,ld)就会用该前缀来定位。
这个前缀可以是用冒号分割的多个路径,环境变量GCC_EXEC_PREFIX和这个选项有相同的效果。

-I 指定搜索系统头文件的目录,可以重复使用多个该选项指定多个目录。

-dumpmachine 显示该程序的目标机名字,不做其他任何动作

-dumpspecs 显示构件编译程序的规范信息,包括用来编译、汇编和连接gcc编译程序自身用到的所有选项,不做其他任何动作。

-dumpversion 显示编译程序自身的版本号,不做其他任何动作

-falign-functions=N 将所有函数的起始地址在N(N=1,2,4,8,16…)的边界上对齐,默认为机器自身的默认值,指定为1表示禁止对齐。

-falign-jumps=N 将分支目标在N(N=1,2,4,8,16…)的边界上对齐,默认为机器自身的默认值,指定为1表示禁止对齐。
-fno-align-labels 建议使用它,以保证不和-falign-jumps("-O2"默认启用的选项)冲突

-fno-align-loops 建议使用它,以确保不会在分支目标前插入多余的空指令。

-fbranch-probabilities 在使用"-fprofile-arcs"选项编译程序并执行它来创建包含每个代码块执行次数的文件之后,程序可以利用这一选项再次编译,
文件中所产生的信息将被用来优化那些经常发生的分支代码。如果没有这些信息,gcc将猜测那一分支可能经常发生并进行优化。
这类优化信息将会存放在一个以源文件为名字的并以".da"为后缀的文件中。

-fno-guess-branch-probability 默认情况下gcc将使用随机模型进行猜测哪个分支更可能被经常执行,并以此来优化代码,该选项关闭它。

-fprofile-arcs 在使用这一选项编译程序并运行它以创建包含每个代码块的执行次数的文件后,程序可以再次使用"-fbranch-probabilities"编译,
文件中的信息可以用来优化那些经常选取的分支。如果没有这些信息,gcc将猜测哪个分支将被经常运行以进行优化。
这类优化信息将会存放在一个以源文件为名字的并以".da"为后缀的文件中。

-fforce-addr 必须将地址复制到寄存器中才能对他们进行运算。由于所需地址通常在前面已经加载到寄存器中了,所以这个选项可以改进代码。
-fforce-mem 必须将数值复制到寄存器中才能对他们进行运算。由于所需数值通常在前面已经加载到寄存器中了,所以这个选项可以改进代码。

-ffreestanding 所编译的程序能够在独立的环境中运行,该环境可以没有标准库,而且可以不从main()函数开始运行。
该选项将设置"-fno-builtin",且等同于"-fno-hosted"。
-fhosted 所编译的程序需要运行在宿主环境中,其中需要有完整的标准库,而且main()函数具有int型的返回值。
-fno-builtin 除非利用"__builtin_"进行引用,否则不识别所有内建函数。

-fmerge-all-constants 试图将跨编译单元的所有常量值和数组合并在一个副本中。但是标准C/C++要求每个变量都必须有不同的存储位置。

-fmove-all-movables 将所有不变的表达式移动到循环体之外,这种做法的好坏取决于源代码中的循环结构。

-fnon-call-exceptions 产生的代码可供陷阱指令(如非法浮点运算和非法内存寻址)抛出异常,需要相关平台的运行时支持,并不普遍有效。

-fomit-frame-pointer 对于不需要栈指针的函数就不在寄存器中保存指针,因此可以忽略存储和检索地址的代码,并将寄存器用于普通用途。
所有"-O"级别都打开着一选项,但仅在调试器可以不依靠栈指针运行时才有效。建议不需要调试的情况下显式的设置它。

-fno-optional-diags 禁止输出诊断消息,C++标准并不需要这些消息。
-fpermissive 将代码中与标准不符合的诊断消息作为警告而不是错误输出。

-fpic 生成可用于共享库的位置独立代码(PIC),所有的内存寻址均通过全局偏移表(GOT)完成。该选项并非在所有的机器上都有效。
要确定一个地址,需要将代码自身的内存位置作为表中的一项插入。该选项可以产生在共享库中存放并从中加载的目标模块。

-fprefetch-loop-arrays 生成数组预读取指令,对于使用巨大数组的程序可以加快代码执行速度,适合数据库相关的大型软件等。

-freg-struct-return 生成用寄存器返回短结构的代码,如果寄存器无法荣纳将使用内存。

-fstack-check 为防止程序栈溢出而进行必要的检测,在多线程环境中运行时才可能需要它。

-ftime-report 编译完成后显示编译耗时的统计信息

-funroll-loops 如果在编译时可以确定迭代的次数非常少而且循环中的指令也非常少,可以使用该选项进行循环展开,以驱除循环和复制指令。

-finline-limit= 对伪指令数超过的函数,编译程序将不进行展开,默认为600

–param = gcc内部存在一些优化代码程度的限制,调整这些限制就是调整整个优化全局。下面列出了参数的名字和对应的解释:
名字 解释
max-delay-slot-insn-search 较大的数目可以生成更优化的代码,但是会降低编译速度,默认为100
max-delay-slot-live-search 较大的数目可以生成更优化的代码,但是会降低编译速度,默认为333
max-gcse-memory 执行GCSE优化使用的最大内存量,太小将使该优化无法进行,默认为50M
max-gcse-passes 执行GCSE优化的最大迭代次数,默认为1

*******************************************************************
说完了命令行选项,下面来说说与硬件体系结构(主要是cpu)相关的设置[仅针对i386/x86_64]
最大名鼎鼎的"-march"上面已经说过了,下面讲讲别的(仅挑些实用的)

-mfpmath=sse P3和athlon-tbird以上级别的cpu支持

-masm= 使用指定的dialect输出汇编语言指令,可以使用"intel"或"att";默认为"att"

-mieee-fp 指定编译器使用IEEE浮点比较,这样将会正确的处理比较结果为无序的情况。

-malign-double 将double, long double, long long对齐于双字节边界上;有助于生成更高速的代码,但是程序的尺寸会变大。

-m128bit-long-double 指定long double为128位,pentium以上的cpu更喜欢这种标准。

-mregparm=N 指定用于传递整数参数的寄存器数目(默认不使用寄存器)。0<=N<=3 ;注意:当N>0时你必须使用同一参数重新构建所有的模块,包括所有的库。

-mmmx
-mno-mmx
-msse
-mno-sse
-msse2
-mno-sse2
-msse3
-mno-sse3
-m3dnow
-mno-3dnow
上面的这些不用解释了,一看就明白,根据自己的CPU决定吧

-maccumulate-outgoing-args 指定在函数引导段中计算输出参数所需最大空间,这在大部分现代cpu中是较快的方法;缺点是会增加代码尺寸。

-mthreads 支持Mingw32的线程安全异常处理。对于依赖于线程安全异常处理的程序,必须启用这个选项。
使用这个选项时会定义"-D_MT",它将包含使用选项"-lmingwthrd"连接的一个特殊的线程辅助库,用于为每个线程清理异常处理数据。

-minline-all-stringops 嵌入所有的字符串操作。可以提高字符串操作的性能,但是会增加代码尺寸。

-momit-leaf-frame-pointer 不为叶子函数在寄存器中保存栈指针,这样可以节省寄存器,但是将会是调试变的困难。参见"-fomit-frame-pointer"。

下面这几个仅用于x86_64环境:

-m64 生成专门运行于64位环境的代码,不能运行于32位环境

-mcmodel=small [默认值]程序和它的符号必须位于2GB以下的地址空间。指针仍然是64位。程序可以静态连接也可以动态连接。
-mcmodel=kernel 内核运行于2GB地址空间之外。在编译linux内核时必须使用该选项!
-mcmodel=medium 程序必须位于2GB以下的地址空间,但是它的符号可以位于任何地址空间。程序可以静态连接也可以动态连接。
注意:共享库不能使用这个选项编译!
-mcmodel=large 对地址空间没有任何限制,这个选项的功能目前尚未实现。

==============================
既然已经讲了这么多了索性再讲讲gcc使用的一些环境变量
除了大名鼎鼎的CFLAGS和CXXFLAGS以外(其实是Autoconf的环境变量),再挑几个说说:
所有的PATH类环境变量(除LD_RUN_PATH外)都是用冒号分割的目录列表。

C_INCLUDE_PATH 编译C程序时使用的环境变量,用于查找头文件。

CPLUS_INCLUDE_PATH 编译C++程序时使用的环境变量,用于查找头文件。

OBJC_INCLUDE_PATH 编译Obj-C程序时使用的环境变量,用于查找头文件。

CPATH 编译C/C++/Obj-C程序时使用的环境变量,用于查找头文件。

COMPILER_PATH 如果没有用GCC_EXEC_PREFIX定位子程序,编译程序将会在此查找它的子程序。

LIBRARY_PATH 连接程序将在这些目录中寻找特殊的连接程序文件。

LD_LIBRARY_PATH 该环境变量不影响编译程序,但是程序运行的时候会有影响:程序会查找该目录列表以寻找共享库。
当不能够在编译程序的目录中找到共享库的时候,执行程序必须设置该环境变量。

LD_RUN_PATH 该环境变量不影响编译程序,但是程序运行的时候会有影响:它在运行时指出了文件的名字,运行的程序可以由此得到它的符号名字和地址。
由于地址不会重新载入,因而可能符号应用其他文件中的绝对地址。这个和ld工具使用的"-R"选项完全一样。

GCC_EXEC_PREFIX 编译程序执行所有子程序的名字的前缀,默认值是"/lib/gcc-lib/",
其中的是安装时configure脚本指定的前缀。

LANG 指定编译程序使用的字符集,可用于创建宽字符文件、串文字、注释;默认为英文。[目前只支持日文"C-JIS,C-SJIS,C-EUCJP",不支持中文]

LC_ALL 指定多字节字符的字符分类,主要用于确定字符串的字符边界以及编译程序使用何种语言发出诊断消息;默认设置与LANG相同。
中文相关的几项:"zh_CN.GB2312 , zh_CN.GB18030 , zh_CN.GBK , zh_CN.UTF-8 , zh_TW.BIG5"

TMPDIR 编译程序存放临时工作文件的临时目录,这些临时文件通常在编译结束时被删除。

Read: 37