这是一个模板,是一些宏的集合,针对跨平台的GCC设计[0.11版以后的与VC9编译器兼容]
只用纯粹的C实现简单的OO的机制而不必了解冗杂的C++的语法,
其实现了简单的"类"的模拟,析构与构造,以及对单根继承的模拟.
在很大程度上,可以模拟完成大部分OO中较为重要的特性.
另有简化版ooc-lite( http://code.google.com/p/ooc-lite/ )及相关文档,
提供测试实例及设计思路详解.
假定有一个名为"A"的"类"
CLASS(A){
...... 这里为实例成员
STATIC(A);
...... 这里是类成员(实际结构体为struct _StA,并被重定义为StA)
};
假定有一个名为"B"的继承了上面"B"的"类"
CLASS_EX(A,B){
.......
STATIC_EX(A,B) ;
.......
};
注意继承时,前面是父类,后面是要定义的子类.
static int A_reload(A *THIS,void *p){
THIS->.... 这里使用第一个参数来初始化实例成员
return 0;
}
static int A_reloadSt(StA *THIS,void *p){
THIS->.... 这里使用第一个参数来初始化类成员
return 0;
}
static int A_unload(A *THIS,void *p){
THIS->.... 这里使用第一个参数来析构实例成员
return 0;
}
ASM(A,A_reload,A_unload,A_reloadSt,NULL)
注意上面最后一个参数为类成员的析构
使用NULL是为了说明无需某个函数时,可以不设置
普通类"A"的使用
A *a=NEW0(A); //声明第一个A的实例时调用StA和A的构造,
//以后再声明A的实例只调用A的构造
StA *fA=ST(a);
fA->someFunc(a,someParam);
DEL0(a); //销毁A的实例时调用A的析构
//当销毁显存的最后一个A的实例时,
//调用A和StA的构造
带有继承的类"B"的使用
B *b=NEW0(B); //注意父类的构造会自动调用
StB *fB=ST(b);
fB->someFunc(b,someParam);
StA *fA=ST(b);
fA->someFunc(b,someParam); 使用父类的方法
DELETE0(b); //无需知道b的具体类型时A或B,都会调用正确的析构
//如果是A的指针,则调用A的析构,如果是B的指针则调用B和A的析构
OOC-GCC 特性介绍 •核心部分仅仅是”宏”,所以编译的时候更加灵活. •两层宏定义,底层的”宏”完全采用英文全称,表意清晰.同时严格控制每个宏的定义,尽力做到不烂用. •对于OO的模拟有构造也有析构,宏的定义具有对称性,同时符合语言规则,如表述表示 类的”名词” + 表示方法的”动词+名词”. •类的定义多数采用全开放的形式,这也使得现在的版本和VC兼容. •方便和C++的配合. •相对完整
一 选项-o 1 点睛 选项-o用于指定要生成的结果文件,后面跟的就是结果文件名字。 o是output的意思,不是目标的意思。 结果文件可能是预处理文件、汇编文件、目标文件或者最终可执行文件。 2 示例 gcc -S test.i -o test.s # -S 说明只进行到编译阶段 # 生成汇编文件test.s 3 示例 gcc -c test.cpp -o test # 这个gest是目标文件,
-c和-o都是gcc编译器的可选参数 -c表示只编译(compile)源文件但不链接,会把.c或.cc的c源程序编译成目标文件,一般是.o文件。 -o用于指定输出(out)文件名。不用-o的话,一般会在当前文件夹下生成默认的a.out文件作为可执行程序。 例如 gcc -c test.c将生成test.o的目标文件 gcc -o app test.c将生成可执行程序app gcc -c a.
http://c.biancheng.net/view/700.html gcc -o选项用来指定输出文件,如果不使用 -o 选项,那么将采用默认的输出文件。例如默认情况下,生成的可执行文件的名字默认为 a.out。 如下是 gcc -o 指令的使用语法格式: [root@bogon demo]# gcc [-E|-S|-c] [infile] [-o outfile] 其中,用方括号 [] 括起
C源文件到可执行文件共经历了4个过程。在使用GCC编译程序时,编译过程可以被细分为四个阶段,包括预处理、编译、汇编、链接。 分步处理 一、预处理 在预处理阶段,编译器主要作加载头文件、宏替换、条件编译的作用。一般处理带“#”的语句。 我们可以通过gcc -E 选项进行查看,如下所示: gcc -E main.c > main.i 编译器将main.c预处理结果输出 main.i 文件。 二、编译
-c和-o都是gcc编译器的可选参数 -c表示只编译(compile)源文件但不链接,会把.c或.cc的c源程序编译成目标文件,一般是.o文件。 -o用于指定输出(out)文件名。不用-o的话,一般会在当前文件夹下生成默认的a.out文件作为可执行程序。 例如 gcc -c test.c将生成test.o的目标文件 gcc -o app test.c将生成可执行程序app gcc -c a.c -
gcc -c a.c 编译成目标文件a.o gcc -o a a.o 生成执行文件a.exe gcc a.c 生成执行文件a.exe gcc -o a -c a.c 编译成目标文件a gcc -o a a.c 生成执行文件a.exe 在a.c中引用test.c中的一个函数后: gcc -c test.c 编译成目标文件test.o gcc -c a.c
GCC -o选项使用举例 1) 将源文件作为输入文件,将可执行文件作为输出文件,也即完整地编译整个程序: $ gcc main.c func.c -o app.out 将 main.c 和 func.c 两个源文件编译成一个可执行文件,其名字为 app.out。如果不使用 -o 选项,那么将生成名字为 a.out 的可执行文件。 2) 将源文件作为输入文件,将目标文件作为输出文件,也即只编译不链接
gcc -c a.c 编译成目标文件a.o gcc -o a a.o 生成执行文件a.exe gcc a.c 生成执行文件a.exe gcc -o a -c a.c 编译成目标文件a gcc -o a a.c 生成执行文件a.exe 在a.c中引用test.c中的一个函数后: gcc -c test.c 编译成目标文件test.o gcc -c a.c 编译成目标文
GCC提供选项控制代码的优化等级: 这些选项可以实现不同程度的优化。 没有任何优化选项的话,编译时的目标是降低编译成本,并使调试产生预期的结果。语句是独立的:如果你使程序停止在语句之间设置的断点处,你可以改变任何变量的值或者改变程序计数器的值使程序执行任意函数中的语句并得到源代码中期望的结果。 打开优化标志使编译器尝试以编译时间和可能的调试程序的能力为代价来改进性能和/或代码大小。 编译器根据程序
查查gcc手册就知道了,每个编译选项都控制着不同的优化选项 下面从网络上copy过来的,真要用到这些还是推荐查阅手册 -O设置一共有五种:-O0、-O1、-O2、-O3和-Os。 除了-O0以外,每一个-O设置都会多启用几个选项,请查阅gcc手册的优化选项章节,以便了解每个-O等级启用了哪些选项及它们有何作用。 让我们来逐一考察各个优化等级: -O0:这个等级(字母“O”后面跟个零)关闭所有优化选
目录 优化等级 -O1 -O2 -O3 -Os -Ofast -Og cmake 生成 debug和 release 版|Cmake设置优化等级 优化等级 -O1 -O2 -O3 -Os -Ofast -Og 一下内容摘自 Using the GNU Compiler Collection (GCC) 一般来说,如果不指定优化标识的话,gcc就会产生可调试代码,每条指令之间将是独立的:可以在指令
gcc-c++也称g++ 一般来说gcc就是c语言的编译器,gcc-c++是c++的编译器 g++和gcc的区别: 1、对于不同后缀的文件当作程序不同。 c后缀的文件,gcc把它当做是C程序;g++当做是C++程序;对于.cpp后缀的文件,gcc和g++都会当做c++程序。 2、编译阶段调用不同,g++会调用gcc; 3、连接阶段方式不同,通常会用g++来完成,这是因为gcc命令不能自动和c++程
一、什么是GCC Linux系统下的Gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。 gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。 Gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.
gcc test.c -o test gcc -E test.c -o test.i 或 gcc -E test.c gcc -S test.i -o test.s gcc -c test.s -o test.o gcc test.o -o test
gcc -c a.c 编译成目标文件a.o gcc -o a a.o 生成执行文件a.exe gcc a.c 生成执行文件a.exe gcc -o a -c a.c 编译成目标文件a gcc -o a a.c 生成执行文件a.exe 在a.c中引用test.c中的一个函数后: gcc -c test.c 编译成目标文件test.o gcc -c a.c 编译成目标文
gcc gcc 命令:用来编译C和C++文件-c 编译、汇编而不链接 -S 编译而不进行汇编和链接 -E 预处理 -v 同时显示编译器的代码 -o<文件> 将输出输入到指定文件 -x<语言> 指定语言 --help 显示帮助信息 --version 显示版本信息 一般情况下如果是单个字符的话使用 ‘-’ ; 如果后面是跟一个word也就是单词的话使用 “- -” ;大部分适用; 在Linux 中
gcc 编译选项中 -O0 -g ,-O3 对程序效率影响很大 。如果是 -O0 -g 编译非优化,会添加调试信息,编译完成后可执行程序非常大,运行效率也会很慢。所以如果自己线下调试程序,可以用-O0 -g,但线上发布时一定要用-O3开启优化选项。
-g 可执行程序包含调试信息:加个-g 是为了gdb 用,不然gdb用不到 -o 指定输出文件名(o:output) -c 只编译不链接:产生.o文件,就是obj文件,不产生执行文件(c : compile) -g为了调试用的 加个-g 是为了gdb 用,不然gdb用不到 -o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不
问题内容: 在Ubuntu上使用’gcc’编译C ++源文件时遇到一个令人费解的问题。解决了这个问题后,我想在这里发布它,以免其他人难以解决。 为了这份报告,我们将最简单的C ++“ Hello,World”程序存储在main.cpp中: 当我运行命令时: 我收到错误消息: 我确认我正在编译正确的位(即32位)。我做错了什么? 问题答案: 事实证明,我已将C ++源文件另存为UTF-16 Unic
问题内容: 假设我有一个非常简单的C文件(称为foo.c): 现在我叫gcc: 当我调用gcc时(如上例所示,没有选项),默认情况下链接了哪些库,它们位于何处?(在Mac OS X 10.7上) 问题答案: 该选项将导致它倾倒它会使用包括图书馆的路径和默认的库文件和目标文件将在被链接的默认选项的信息。 如果提供该选项,则gcc会将传递给链接器,该链接器将准确地转储其在查找库的位置,包括失败和成功搜
问题内容: 我们有一个新的应用程序,需要glibc 2.4(来自gcc 4.1)。我们运行的机器具有gcc 3.4.6。我们无法升级,并且应用程序必须在此计算机上运行。 我们安装了gcc 4.1,但是在编译时,它使用的是3.4.6中的所有include等。 我们如何解决这个问题? 关于仅将此应用程序使用4.1的任何建议? 问题答案: 请参阅“如何安装GCC的多个版本” 这里的GNU GCC FAQ
问题内容: 今天,每个现代OS都提供一些原子操作: Windows具有API FreeBSD有 Solaris有 Mac OS X具有 像Linux一样的东西吗? 我需要它在大多数Linux支持的平台上工作,包括:x86,x86_64和 arm 。 我至少在GCC和Intel编译器上需要它。 我不需要使用像glib或qt这样的3rd par库。 我需要它才能在C ++中工作(不需要C) 问题: G
问题内容: 因此,当我们执行以下操作时: 与 编译器(在我的情况下为GCC)知道stdio.h(甚至是目标文件)在我的硬盘上的位置。它只是利用文件,而没有我的参与。 我 认为 在我的Ubuntu Linux机器上,文件存储在。 编译器如何知道在哪里寻找这些文件? 这是可配置的还是仅仅是预期的默认值?我在哪里寻找这种配置? 由于我要问这些包含文件的问题,这些文件的来源是什么? 我知道这在Linux社
问题内容: 在toUpper函数中,返回类型为char,但是toUpper()中没有“ return”。并使用gcc(GCC)4.5.1 20100924(Red Hat 4.5.1-4),fedora-14编译源代码。 当然,会发出警告:“警告:控制到达非无效功能的尽头”,但是效果很好。 用gcc编译期间该代码中发生了什么?在这种情况下,我想得到一个可靠的答案。谢谢 :) 问题答案: 您遇到的是