CB for C_Cpp Novice1
- 格式:doc
- 大小:2.01 MB
- 文档页数:31
c++中实现调用外部程序的方法linux 概述及解释说明1. 引言1.1 概述本篇文章旨在探讨在C++语言中如何调用外部程序,并着重介绍在Linux环境下的具体方法。
调用外部程序是在软件开发中常见的需求,通过调用外部程序可以实现更多功能和交互方式。
本文将从基本原理以及注意事项开始阐述,然后详细介绍在C++中实现调用外部程序的方法,并给出示例代码进行解析。
1.2 文章结构本文将按照以下结构组织内容:首先,在引言部分进行概述和明确目的;然后在第2节中,详细讲解在C++中调用外部程序的方法,包括基本原理和Linux环境下的注意事项;紧接着,在第3节中,将通过示例及代码解析展示具体的调用外部程序的实现过程;最后,在第4节中,介绍使用第三方库实现更复杂交互方式的方法,并给出相关示例;最后一节为结论与总结。
1.3 目的本文旨在提供读者关于C++语言中如何通过调用外部程序来扩展功能和实现更灵活交互方式方面的详尽解释。
通过了解基本原理以及学习具体实践案例,读者可获得掌握在C++中调用外部程序的能力。
另外,引入第三方库实现更复杂交互方式的方法也将拓宽读者的知识面和技能应用范围。
最终,通过全面而清晰地阐述调用外部程序的方法,本文旨在提供有关调用外部程序的详尽指南,并启示读者对未来可能发展方向的展望。
以上是关于文章“1. 引言”部分内容的详细说明。
2. 调用外部程序的方法:在C++中,调用外部程序是一种常见的需求,可以通过多种方式实现。
本节将介绍C++中调用外部程序的基本原理、在Linux环境下调用外部程序时需要注意的事项以及具体的实现方法介绍。
2.1 C++中调用外部程序的基本原理:在C++中,调用外部程序可以借助操作系统提供的系统调用或库函数来实现。
常见的方法包括使用system函数、使用fork和exec函数族以及使用popen 函数等。
2.2 Linux环境下调用外部程序的注意事项:在Linux环境下调用外部程序时,需要注意以下几个方面:- 文件路径:确保正确地指定待执行的外部程序文件路径,在使用相对路径时要考虑当前工作目录。
VC经典的编译错误解决办法(转载)-jacky的日志-网易博客VC经典的编译错误解决办法(转载)vc编程 2008-07-08 11:09:39 阅读39 评论0 字号:大中小订阅1、Fatal Error C1010: unexpected end of file while looking for precompiled header directive:编译时总出这个错误为什么?: fatal error C1010: unexpected end of file while looking for precompiled: header directive: 我查了msdn好像不是他说的错误原因.这是预编译头文件没有包括进来, 有两种解决办法。
(一) 是把所有的源程序文件前面都加上#include(二) 如果你不原意改变源文件就在菜单上选择Project->Settings... 选择相应的配置(如果你是用Debug方式编译,就选Debug方式,如果Release方式就用Release),然后把下面的源文件树打开,选择没有加上面那个include语句的文件,在右边把有关precompiled的项目取消或选成none precompiled之类的选项就成了.2、Linker Tools Error LNK2001: unresolved external symbol "symbol"学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。
产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。
如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。
初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:unresolved external symbol “symbol”(不确定的外部“符号”)。
第一章C++编程基础spacea)using directive:using namespace std; //std是标准程序库所在命名空间2.constructor syntaxa)i nt num_tries(0) == int num_tries=0b)complex<double> purei(0,7)第二章面向过程的编程风格1.pointera)未初始化时指向随机值b)i nt *iv=0;对i nt *iv=10;错cannot vonvert from ‘const int’ to ‘int *’2.referencea)C++不允许改变reference代表的对象,reference在申明时必须赋值b)By reference时复制对象的地址,而不会复制对象本身c)Pointer与reference之间的差别在于,指针可能(也可能不)指向某个实际对象。
所以我们使用指针时,一定要先确定其值并非为0。
而reference则必定代表某个对象。
3.生存空间(scope)和生存范围(extent)a)函数内定义的对象(local scope)只存活于函数执行之际,(函数位于程序栈之上,局部对象被放置在这块空间),因此如果将这些局部对象的地址返回,会导致执行期错误。
(与Java的不同, Java的所有对象都动态创建在堆空间,程序栈上只创建引用,所以返回的时候如果引用有所指,该对象就不会被垃圾回收)b)在函数外声明的对象,具有file scope。
既从声明点到文件尾端都可视。
内建类别的对象,如果定义在file scope内,必定被初始化为0,但如果被定义在local scope内,不会被初始化。
4.动态内存管理a)内存管理分两种:系统自动管理,动态内存管理。
Local extent 或file extent都属于系统自动管理。
Dynamic extent属于程序员自行管理,也称heap memory。
在C 语言中调用C++ 代码需要进行一些特殊的处理,因为C++ 支持面向对象编程和函数重载等特性,而 C 语言不支持这些特性。
以下是一种常见的方法,可以在 C 语言中调用C++ 代码:1. 创建C++ 代码和头文件:-首先,编写需要被调用的C++ 函数,并将其放在一个独立的源文件中,例如`mycppcode.cpp`。
-在同一目录下创建一个头文件`mycppcode.h`,声明需要被调用的C++ 函数的接口。
// mycppcode.h#ifdef __cplusplusextern "C" {#endifvoid my_cpp_function(int arg);#ifdef __cplusplus}#endif// mycppcode.cpp#include "mycppcode.h"void my_cpp_function(int arg) {// 实现C++ 函数的具体逻辑}2. 编译C++ 代码为动态链接库(DLL):-使用C++ 编译器(如g++)编译`mycppcode.cpp` 为动态链接库(DLL)。
-在Windows 平台上,可以使用以下命令生成DLL 文件:g++ -shared -o mycppcode.dll mycppcode.cpp-在Linux 平台上,可以使用以下命令生成共享库文件:g++ -shared -o mycppcode.so mycppcode.cpp3. 创建C 代码:-在C 代码中包含C++ 函数的声明所在的头文件。
-在C 代码中调用C++ 函数,需要使用`extern "C"` 声明来告诉编译器这是一个C 风格的函数。
// myccode.c#include <stdio.h>#include "mycppcode.h"int main() {// 调用C++ 函数my_cpp_function(42);return 0;}4. 编译链接C 代码:-使用C 编译器(如gcc)编译链接`myccode.c` 和生成的动态链接库文件。
GCC 中文手册GCCSection: GNU Tools (1)Updated: 2003/12/05Index Return to Main ContentsNAMEgcc,g++-GNU工程的C和C++编译器(egcs-1.1.2)总览(SYNOPSIS)gcc[option|filename ]...g++[option|filename ]...警告(WARNING)本手册页内容摘自GNU C编译器的完整文档,仅限于解释选项的含义.除非有人自愿维护,否则本手册页不再更新.如果发现手册页和软件之间有所矛盾,请查对Info文件, Info文件是权威文档.如果我们发觉本手册页的内容由于过时而导致明显的混乱和抱怨时,我们就停止发布它.不可能有其他选择,象更新Info文件同时更新man手册,因为其他维护GNU CC的工作没有留给我们时间做这个. GNU 工程认为man手册是过时产物,应该把时间用到别的地方.如果需要完整和最新的文档,请查阅Info文件`gcc’或Using and Porting GNU CC (for version 2.0) (使用和移植GNU CC 2.0) 手册.二者均来自Texinfo原文件 gcc.texinfo.描述(DESCRIPTION)C和C++编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking).源文件后缀名标识源文件的语言,但是对编译器来说,后缀名控制着缺省设定:gcc认为预处理后的文件(.i)是C文件,并且设定C形式的连接.g++认为预处理后的文件(.i)是C++文件,并且设定C++形式的连接.源文件后缀名指出语言种类以及后期的操作:.c C源程序;预处理,编译,汇编.C C++源程序;预处理,编译,汇编.cc C++源程序;预处理,编译,汇编.cxx C++源程序;预处理,编译,汇编.m Objective-C源程序;预处理,编译,汇编.i 预处理后的C文件;编译,汇编.ii 预处理后的C++文件;编译,汇编.s 汇编语言源程序;汇编.S 汇编语言源程序;预处理,汇编.h 预处理器文件;通常不出现在命令行上其他后缀名的文件被传递给连接器(linker).通常包括:.o 目标文件(Object file).a 归档库文件(Archive file)除非使用了-c, -S,或-E选项(或者编译错误阻止了完整的过程),否则连接总是最后的步骤.在连接阶段中,所有对应于源程序的.o文件, -l库文件,无法识别的文件名(包括指定的 .o目标文件和.a库文件)按命令行中的顺序传递给连接器.选项(OPTIONS)选项必须分立给出: `-dr’完全不同于`-d -r ’.大多数`-f’和`-W’选项有两个相反的格式: -fname和 -fno-name (或-Wname和-Wno-name).这里只列举不是默认选项的格式.下面是所有选项的摘要,按类型分组,解释放在后面的章节中.总体选项(Overall Option)-c -S -E -o file -pipe -v -x language语言选项(Language Option)-ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers -fenum-int-equiv -fexternal-templates -fno-asm -fno-builtin -fhosted -fno-hosted -ffreestanding -fno-freestanding -fno-strict-prototype -fsigned-bitfields -fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -fwritable-strings -traditional -traditional-cpp -trigraphs警告选项(Warning Option)-fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscript -Wcomment -Wconversion -Wenum-clash -Werror -Wformat -Wid-clash-len -Wimplicit -Wimplicit-int -Wimplicit-function-declaration -Winline -Wlong-long -Wmain -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch -Wtemplate-debugging -Wtraditional -Wtrigraphs -Wuninitialized -Wunused -Wwrite-strings调试选项(Debugging Option)-a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name -print-prog-name=program优化选项(Optimization Option)-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops -O -O2 -O3预处理器选项(Preprocessor Option)-Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -Umacro -undef汇编器选项(Assembler Option)-Wa,option连接器选项(Linker Option)-llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -u symbol目录选项(Directory Option)-Bprefix -Idir -I- -Ldir目标机选项(Target Option)-b machine -V version配置相关选项(Configuration Dependent Option)M680x0 选项-m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-floatVAX选项-mg -mgnu -munixSPARC选项-mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8 -msupersparc -mcypressConvex选项-margcount -mc1 -mc2 -mnoargcountAMD29K选项-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registersM88K选项-m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-shift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mno-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area -mserialize-volatile -mshort-data-num -msvr3 -msvr4 -mtrap-large-shift -muse-div-instruction -mversion-03.00 -mwarn-passed-structsRS6000选项-mfp-in-toc -mno-fop-in-tocRT选项-mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-returnMIPS选项-mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num -nocppi386选项-m486 -mno-486 -msoft-float -mno-fp-ret-in-387HPPA选项-mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlong-calls -mdisable-fpregs -mdisable-indexing -mtrailing-coloni960选项-mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-align DEC Alpha选项-mfp-regs -mno-fp-regs -mno-soft-float -msoft-floatSystem V选项-G -Qy -Qn -YP,paths -Ym,dir代码生成选项(Code Generation Option)-fcall-saved-reg -fcall-used-reg -ffixed-reg -finhibit-size-directive -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC -freg-struct-return -fshared-data -fshort-enums -fshort-double -fvolatile -fvolatile-global -fverbose-asm总体选项(Overall Option)-x language明确指出后面输入文件的语言为language (而不是从文件名后缀得到的默认选择).这个选项应用于后面所有的输入文件,直到遇着下一个`-x’选项. language的可选值有`c’, `objective-c’, `c-header’, `c++’, `cpp-output’, `assembler’,和`assembler-with-cpp’.-x none关闭任何对语种的明确说明,因此依据文件名后缀处理后面的文件(就象是从未使用过`-x’选项).如果只操作四个阶段(预处理,编译,汇编,连接)中的一部分,可以使用`-x’选项(或文件名后缀)告诉 gcc从哪里开始,用`-c’, `-S’,或`-E’选项告诉gcc到哪里结束.注意,某些选项组合(例如, `-x cpp-output -E’)使gcc不作任何事情.-c编译或汇编源文件,但是不作连接.编译器输出对应于源文件的目标文件.缺省情况下, GCC通过用`.o’替换源文件名后缀`.c’, `.i’, `.s’,等等,产生目标文件名.可以使用-o选项选择其他名字.GCC忽略-c选项后面任何无法识别的输入文件(他们不需要编译或汇编).-S编译后即停止,不进行汇编.对于每个输入的非汇编语言文件,输出文件是汇编语言文件.缺省情况下, GCC通过用`.o’替换源文件名后缀`.c’, `.i’,等等,产生目标文件名.可以使用-o选项选择其他名字.GCC忽略任何不需要编译的输入文件.-E预处理后即停止,不进行编译.预处理后的代码送往标准输出.GCC忽略任何不需要预处理的输入文件.-o file指定输出文件为file.该选项不在乎GCC产生什么输出,无论是可执行文件,目标文件,汇编文件还是预处理后的C代码.由于只能指定一个输出文件,因此编译多个输入文件时,使用`-o’选项没有意义,除非输出一个可执行文件.如果没有使用`-o’选项,默认的输出结果是:可执行文件为`a.out’, `source.suffix ’的目标文件是`source.o’,汇编文件是 `source.s’,而预处理后的C源代码送往标准输出.-v(在标准错误)显示执行编译阶段的命令.同时显示编译器驱动程序,预处理器,编译器的版本号.-pipe在编译过程的不同阶段间使用管道而非临时文件进行通信.这个选项在某些系统上无法工作,因为那些系统的汇编器不能从管道读取数据. GNU的汇编器没有这个问题.语言选项(LANGUAGE OPTIONS)下列选项控制编译器能够接受的C "方言":-ansi支持符合ANSI标准的C程序.这样就会关闭GNU C中某些不兼容ANSI C的特性,例如asm, inline和 typeof关键字,以及诸如unix和vax这些表明当前系统类型的预定义宏.同时开启不受欢迎和极少使用的ANSI trigraph特性,以及禁止`$’成为标识符的一部分.尽管使用了`-ansi’选项,下面这些可选的关键字, __asm__, __extension__, __inline__和__typeof__仍然有效.你当然不会把他们用在ANSI C程序中,但可以把他们放在头文件里,因为编译包含这些头文件的程序时,可能会指定 `-ansi’选项.另外一些预定义宏,如__unix__和__vax__,无论有没有使用 `-ansi’选项,始终有效.使用`-ansi’选项不会自动拒绝编译非ANSI程序,除非增加`-pedantic’选项作为 `-ansi’选项的补充.使用`-ansi’选项的时候,预处理器会预定义一个__STRICT_ANSI__宏.有些头文件关注此宏,以避免声明某些函数,或者避免定义某些宏,这些函数和宏不被ANSI标准调用;这样就不会干扰在其他地方使用这些名字的程序了.-fno-asm不把asm, inline或typeof当作关键字,因此这些词可以用做标识符.用 __asm__, __inline__和__typeof__能够替代他们. `-ansi’ 隐含声明了`-fno-asm’.-fno-builtin不接受不是两个下划线开头的内建函数(built-in function).目前受影响的函数有_exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt, strcmp, strcpy,和strlen. `-ansi’选项能够阻止alloca和_exit成为内建函数.-fhosted按宿主环境编译;他隐含声明了`-fbuiltin’选项,而且警告不正确的main函数声明.-ffreestanding按独立环境编译;他隐含声明了`-fno-builtin’选项,而且对main函数没有特别要求.(译注:宿主环境(hosted environment)下所有的标准库可用, main函数返回一个int值,典型例子是除了内核以外几乎所有的程序.对应的独立环境(freestanding environment)不存在标准库,程序入口也不一定是 main,最明显的例子就是操作系统内核.详情参考gcc网站最近的资料)-fno-strict-prototype对于没有参数的函数声明,例如`int foo ();’,按C风格处理---即不说明参数个数或类型. (仅针对C++).正常情况下,这样的函数foo在C++中意味着参数为空.-trigraphs支持ANSI C trigraphs. `-ansi’选项隐含声明了`-trigraphs’.-traditional试图支持传统C编译器的某些方面.详见GNU C手册,我们已经把细节清单从这里删除,这样当内容过时后,人们也不会埋怨我们.除了一件事:对于C++程序(不是C), `-traditional’选项带来一个附加效应,允许对 this赋值.他和`-fthis-is-variable’选项的效果一样.-traditional-cpp试图支持传统C预处理器的某些方面.特别是上面提到有关预处理器的内容,但是不包括 `-traditional’选项的其他效应.-fdollars-in-identifiers允许在标识符(identifier)中使用`$’字符(仅针对C++).你可以指定 `-fno-dollars-in-identifiers’选项显明禁止使用`$’符. (GNU C++在某些目标系统缺省允许`$’符,但不是所有系统.)-fenum-int-equiv允许int类型到枚举类型(enumeration)的隐式转换(仅限于C++).正常情况下GNU C++允许从 enum到int的转换,反之则不行.-fexternal-templates为模板声明(template declaration)产生较小的代码(仅限于C++),方法是对于每个模板函数 (template function),只在定义他们的地方生成一个副本.想要成功使用这个选项,你必须在所有使用模板的文件中,标记`#pragma implementation’ (定义)或`#pragma interface’ (声明).当程序用`-fexternal-templates’编译时,模板实例(template instantiation) 全部是外部类型.你必须让需要的实例在实现文件中出现.可以通过typedef实现这一点,他引用所需的每个实例.相对应的,如果编译时使用缺省选项`-fno-external-templates’,所有模板实例明确的设为内置.-fall-virtual所有可能的成员函数默认为虚函数.所有的成员函数(除了构造子函数和new或delete 成员操作符)视为所在类的虚函数.这不表明每次调用成员函数都将通过内部虚函数表.有些情况下,编译器能够判断出可以直接调用某个虚函数;这时就直接调用.-fcond-mismatch允许条件表达式的第二和第三个参数的类型不匹配.这种表达式的值是void.-fthis-is-variable允许对this赋值(仅对C++).合并用户自定义的自由存储管理机制到C++后,使可赋值的 `this’显得不合时宜.因此,默认情况下,类成员函数内部对this赋值是无效操作.然而为了向后兼容,你可以通过`-fthis-is-variable’选项使这种操作有效.-funsigned-char把char定义为无符号类型,如同unsigned char.各种机器都有自己缺省的char类型.既可能是unsigned char也可能是signed char .理想情况下,当依赖于数据的符号性时,一个可移植程序总是应该使用signed char或unsigned char.但是许多程序已经写成只用简单的char,并且期待这是有符号数(或者无符号数,具体情况取决于编写程序的目标机器).这个选项,和它的反义选项,使那样的程序工作在对应的默认值上.char的类型始终应该明确定义为signed char或unsigned char,即使它表现的和其中之一完全一样.-fsigned-char把char定义为有符号类型,如同signed char.这个选项等同于`-fno-unsigned-char’,他是the negative form of `-funsigned-char’的相反选项.同样, `-fno-signed-char’等价于 `-funsigned-char’.-fsigned-bitfields-funsigned-bitfields-fno-signed-bitfields-fno-unsigned-bitfields如果没有明确声明`signed’或`unsigned’修饰符,这些选项用来定义有符号位域 (bitfield)或无符号位域.缺省情况下,位域是有符号的,因为他们继承的基本整数类型,如int,是有符号数.然而,如果指定了`-traditional’选项,位域永远是无符号数.-fwritable-strings把字符串常量存储到可写数据段,而且不做特别对待.这是为了兼容一些老程序,他们假设字符串常量是可写的. `-traditional’选项也有相同效果.篡改字符串常量是一个非常糟糕的想法; ``常量’’就应该是常量.预处理器选项(Preprocessor Option)下列选项针对C预处理器,预处理器用在正式编译以前,对C 源文件进行某种处理.如果指定了`-E’选项, GCC只进行预处理工作.下面的某些选项必须和`-E’选项一起才有意义,因为他们的输出结果不能用于编译.-include file在处理常规输入文件之前,首先处理文件file,其结果是,文件file的内容先得到编译. 命令行上任何`-D’和`-U’选项永远在`-include file’之前处理, 无论他们在命令行上的顺序如何.然而`-include’和`-imacros’选项按书写顺序处理.-imacros file在处理常规输入文件之前,首先处理文件file,但是忽略输出结果.由于丢弃了文件file的输出内容, `-imacros file’选项的唯一效果就是使文件file中的宏定义生效, 可以用于其他输入文件.在处理`-imacrosfile’选项之前,预处理器首先处理`-D’ 和`-U’选项,并不在乎他们在命令行上的顺序.然而`-include’和 `-imacros’选项按书写顺序处理.-idirafter dir把目录dir添加到第二包含路径中.如果某个头文件在主包含路径(用`-I’添加的路径)中没有找到,预处理器就搜索第二包含路径.-iprefix prefix指定prefix作为后续`-iwithprefix’选项的前缀.-iwithprefix dir把目录添加到第二包含路径中.目录名由prefix和dir合并而成,这里 prefix被先前的`-iprefix’选项指定. -nostdinc不要在标准系统目录中寻找头文件.只搜索`-I’选项指定的目录(以及当前目录,如果合适).结合使用`-nostdinc’和`-I-’选项,你可以把包含文件搜索限制在显式指定的目录.-nostdinc++不要在C++专用标准目录中寻找头文件,但是仍然搜索其他标准目录. (当建立`libg++’时使用这个选项.) -undef不要预定义任何非标准宏. (包括系统结构标志).-E仅运行C预处理器.预处理所有指定的C源文件,结果送往标准输出或指定的输出文件.-C告诉预处理器不要丢弃注释.配合`-E’选项使用.-P告诉预处理器不要产生`#line’命令.配合`-E’选项使用.-M [ -MG ]告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系.对于每个源文件,预处理器输出一个make规则,该规则的目标项(target)是源文件对应的目标文件名,依赖项(dependency)是源文件中 `#include引用的所有文件.生成的规则可以是单行,但如果太长,就用`\’-换行符续成多行.规则显示在标准输出,不产生预处理过的C程序.`-M’隐含了`-E’选项.`-MG’要求把缺失的头文件按存在对待,并且假定他们和源程序文件在同一目录下.必须和 `-M’选项一起用.-MM [ -MG ]和`-M’选项类似,但是输出结果仅涉及用户头文件,象这样`#include file"’.忽略系统头文件如`#include <file>’.-MD和`-M’选项类似,但是把依赖信息输出在文件中,文件名通过把输出文件名末尾的`.o’替换为 `.d’产生.同时继续指定的编译工作---`-MD’不象`-M’那样阻止正常的编译任务.Mach的实用工具`md’能够合并`.d’文件,产生适用于`make’命令的单一的依赖文件.-MMD和`-MD’选项类似,但是输出结果仅涉及用户头文件,忽略系统头文件.-H除了其他普通的操作, GCC显示引用过的头文件名.-Aquestion(answer)如果预处理器做条件测试,如`#if #question(answer)’,该选项可以断言(Assert) question的答案是answer. -A-’关闭一般用于描述目标机的标准断言.-Dmacro定义宏macro,宏的内容定义为字符串`1’.-Dmacro=defn定义宏macro的内容为defn.命令行上所有的`-D’选项在 `-U’选项之前处理.-Umacro取消宏macro. `-U’选项在所有的`-D’选项之后处理,但是优先于任何 `-include’或`-imacros’选项.-dM告诉预处理器输出有效的宏定义列表(预处理结束时仍然有效的宏定义).该选项需结合`-E’选项使用.-dD告诉预处理器把所有的宏定义传递到输出端,按照出现的顺序显示.-dN和`-dD’选项类似,但是忽略宏的参量或内容.只在输出端显示`#define name.汇编器选项(ASSEMBLER OPTION)-Wa,option把选项option传递给汇编器.如果option含有逗号,就在逗号处分割成多个选项.连接器选项(LINKER OPTION)下面的选项用于编译器连接目标文件,输出可执行文件的时候.如果编译器不进行连接,他们就毫无意义.object-file-name如果某些文件没有特别明确的后缀a special recognized suffix, GCC就认为他们是目标文件或库文件. (根据文件内容,连接器能够区分目标文件和库文件).如果GCC执行连接操作,这些目标文件将成为连接器的输入文件.-llibrary连接名为library的库文件.连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是`liblibrary.a’.连接器会当做文件名得到准确说明一样引用这个文件.搜索目录除了一些系统标准目录外,还包括用户以`-L’选项指定的路径.一般说来用这个方法找到的文件是库文件---即由目标文件组成的归档文件(archive file).连接器处理归档文件的方法是:扫描归档文件,寻找某些成员,这些成员的符号目前已被引用,不过还没有被定义.但是,如果连接器找到普通的目标文件,而不是库文件,就把这个目标文件按平常方式连接进来.指定`-l’选项和指定文件名的唯一区别是, `-l选项用`lib’和`.a’把library包裹起来,而且搜索一些目录.-lobjc这个-l选项的特殊形式用于连接Objective C程序.-nostartfiles不连接系统标准启动文件,而标准库文件仍然正常使用.-nostdlib不连接系统标准启动文件和标准库文件.只把指定的文件传递给连接器.-static在支持动态连接(dynamic linking)的系统上,阻止连接共享库.该选项在其他系统上无效.-shared生成一个共享目标文件,他可以和其他目标文件连接产生可执行文件.只有部分系统支持该选项.-symbolic建立共享目标文件的时候,把引用绑定到全局符号上.对所有无法解析的引用作出警告(除非用连接编辑选项 `-Xlinker -z -Xlinker defs’取代).只有部分系统支持该选项.-Xlinker option把选项option传递给连接器.可以用他传递系统特定的连接选项, GNU CC无法识别这些选项.如果需要传递携带参数的选项,你必须使用两次`-Xlinker’,一次传递选项,另一次传递他的参数. 例如,如果传递`-assert definitions’,你必须写成`-Xlinker -assert -Xlinker definitions’,而不能写成`-Xlinker "-assert definitions"’,因为这样会把整个字符串当做一个参数传递,显然这不是连接器期待的.-Wl,option把选项option传递给连接器.如果option中含有逗号,就在逗号处分割成多个选项.-u symbol使连接器认为取消了symbol的符号定义,从而连接库模块以取得定义.你可以使用多个 `-u’选项,各自跟上不同的符号,使得连接器调入附加的库模块.目录选项(DIRECTORY OPTION)下列选项指定搜索路径,用于查找头文件,库文件,或编译器的某些成员:-Idir在头文件的搜索路径列表中添加dir 目录.-I-任何在`-I-’前面用`-I’选项指定的搜索路径只适用于`#include "file"’这种情况;他们不能用来搜索`#include <file>’包含的头文件.如果用`-I’选项指定的搜索路径位于`-I-’选项后面,就可以在这些路径中搜索所有的 `#include’指令. (一般说来-I选项就是这么用的.)还有, `-I-’选项能够阻止当前目录(存放当前输入文件的地方)成为搜索`#include "file"’的第一选择.没有办法克服`-I-’选项的这个效应.你可以指定 `-I.’搜索那个目录,它在调用编译器时是当前目录.这和预处理器的默认行为不完全一样,但是结果通常令人满意.`-I-’不影响使用系统标准目录,因此, `-I-’和`-nostdinc’是不同的选项.-Ldir在`-l’选项的搜索路径列表中添加dir目录.-Bprefix这个选项指出在何处寻找可执行文件,库文件,以及编译器自己的数据文件.编译器驱动程序需要执行某些下面的子程序: `cpp’, `cc1’ (或C++的 `cc1plus’), `as’和`ld’.他把prefix当作欲执行的程序的前缀,既可以包括也可以不包括`machine/version/’.对于要运行的子程序,编译器驱动程序首先试着加上`-B’前缀(如果存在).如果没有找到文件,或没有指定 `-B’选项,编译器接着会试验两个标准前缀`/usr/lib/gcc/’和 `/usr/local/lib/gcc-lib/’.如果仍然没能够找到所需文件,编译器就在`PATH’环境变量指定的路径中寻找没加任何前缀的文件名.如果有需要,运行时(run-time)支持文件`libgcc.a’也在`-B’前缀的搜索范围之内. 如果这里没有找到,就在上面提到的两个标准前缀中寻找,仅此而已.如果上述方法没有找到这个文件,就不连接他了.多数情况的多数机器上, `libgcc.a’并非必不可少.你可以通过环境变量GCC_EXEC_PREFIX获得近似的效果;如果定义了这个变量,其值就和上面说的一样用做前缀.如果同时指定了`-B’选项和GCC_EXEC_PREFIX变量,编译器首先使用 `-B’选项,然后才尝试环境变量值.警告选项(WARNING OPTION)警告是针对程序结构的诊断信息,程序不一定有错误,而是存在风险,或者可能存在错误.下列选项控制GNU CC产生的警告的数量和类型:-fsyntax-only检查程序中的语法错误,但是不产生输出信息.-w禁止所有警告信息.-Wno-import禁止所有关于#import的警告信息.-pedantic打开完全服从ANSI C标准所需的全部警告诊断;拒绝接受采用了被禁止的语法扩展的程序.无论有没有这个选项,符合ANSI C标准的程序应该能够被正确编译(虽然极少数程序需要`-ansi’ 选项).然而,如果没有这个选项,某些GNU扩展和传统C特性也得到支持.使用这个选项可以拒绝这些程序.没有理由使用这个选项,他存在只是为了满足一些书呆子(pedant).对于替选关键字(他们以`__’开始和结束) `-pedantic’不会产生警告信息. Pedantic 也不警告跟在__extension__后面的表达式.不过只应该在系统头文件中使用这种转义措施,应用程序最好避免.-pedantic-errors该选项和`-pedantic’类似,但是显示错误而不是警告.-W对下列事件显示额外的警告信息:*非易变自动变量(nonvolatile automatic variable)可能在调用longjmp时发生改变. 这些警告仅在优化编译时发生.编译器只知道对setjmp的调用,他不可能知道会在哪里调用longjmp,事实上一个信号处理例程可以在程序的任何地点调用他.其结果是,即使程序没有问题,你也可能会得到警告,因为无法在可能出现问题的地方调用longjmp.*既可以返回值,也可以不返回值的函数. (缺少结尾的函数体被看作不返回函数值)例如,下面的函数将导致这种警告:foo (a){if (a > 0)return a;}由于GNU CC不知道某些函数永不返回(含有abort和longjmp),因此有可能出现虚假警告.*表达式语句或逗号表达式的左侧没有产生作用(side effect).如果要防止这种警告,应该把未使用的表达式强制转换为void类型.例如,这样的表达式`x[i,j]’会导致警告,而`x[(void)i,j]’就不会.*无符号数用`>’或`<=’和零做比较.-Wimplicit-int警告没有指定类型的声明.-Wimplicit-function-declaration警告在声明之前就使用的函数.-Wimplicit同-Wimplicit-int和-Wimplicit-function-declaration.-Wmain如果把main函数声明或定义成奇怪的类型,编译器就发出警告.典型情况下,这个函数用于外部连接, 返回int数值,不需要参数,或指定两个参数.-Wreturn-type如果函数定义了返回类型,而默认类型是int型,编译器就发出警告.同时警告那些不带返回值的 return语句,如果他们所属的函数并非void类型.-Wunused如果某个局部变量除了声明就没再使用,或者声明了静态函数但是没有定义,或者某条语句的运算结果显然没有使用, 编译器就发出警告.-Wswitch如果某条switch语句的参数属于枚举类型,但是没有对应的case语句使用枚举元素,编译器就发出警告. ( default语句的出现能够防止这个警告.)超出枚举范围的case语句同样会导致这个警告.-Wcomment如果注释起始序列`/*’出现在注释中,编译器就发出警告.。
VC 2010下使用C++与C语言混合编程时工程设置方法
在VC2010下使用MFC与C语言混合编程时需要经过一个小小的设置,才能让编译器同时编译”.c”文件与”.cpp”文件。
新建好MFC工程后,再添加你想编译的c文件。
然后工程界面左侧的Solution Explorer中,对着刚刚添加的c文件,然后点击右键,单击property。
在弹出的对话框中,点击窗口左侧的分类,单击c/c++ -> Precompiled Header,并设置如下图所示。
这样就可以正常编译了。
多个.c文件可以选中后统一设置,这个是vc2010人性化的地方。
本来的c++文件无需任何设置。
另外在.c文件对应的头中必须加上extern “C”声明,告诉C++编译器,以C编译的方式编译C 文件。
即
#ifdef __cplusplus
extern “C” {
#endif
// 函数声明
#ifdef __cplusplus
}
#endif
1。
CC++开源库及⽰例代码C/C++ 开源库及⽰例代码Table of Contents说明本页⾯汇总俺收集的各种 C 和 C++ 的开源代码库,不定期更新。
如果你发现本页⾯的开源库有错漏之处,⾮常欢迎给俺提供反馈——有 GitHub 帐号的同学,可以;没帐号的同学,可以去留⾔。
1 综合性的库BoostHome:Wikipedia:、Boost ⼤概是最重要的第三⽅ C++ 库。
其作者有很多是 C++ 标准委员会的成员。
Boost 的很多⼦库后来都成为 C++ 的标准库。
本页⾯的其它章节还会继续提及 Boost 在各种领域的应⽤。
wxWidgetsHome:Wikipedia:、这是⼀个⾮常⽼牌的 C++ 开源 GUI 框架,诞⽣于1992年。
原先叫做 wxWindows,后来因为微软的法律纠纷,改为现名。
它⽀持的操作系统平台很多(包括嵌⼊式系统)。
很多开源项⽬⽤到它,⽐如:BitTorrent、aMule、FileZilla、Code::Blocks、Dolphin......虽然它以 GUI 为主,但是也提供了其它⼀些辅助功能(⽐如:进程间通讯、⽹络、数据库、多媒体......)QtHome:Wikipedia:、它⽀持的操作系统平台很多(包括嵌⼊式系统)。
虽然它以 GUI 为主,但是也提供了其它⼀些辅助功能(⽐如:⽹络、数据库、多媒体、3D引擎......)APR(Apache Portable Runtime)Home:Wikipedia:、这是由 Apache 社区维护的 C 开源库,主要提供操作系统相关的功能(⽂件系统、进程、线程、⽤户、IPC)。
此外还提供了⼀些⽹络相关的功能。
APR 原先是 Apache Web 服务器的⼀个组成部分,后来独⽴出来,成为⼀个单独的开源项⽬。
ACE(Adaptive Communication Environment)Home:Wikipedia:、这是⼀个跨平台的 C++ 库,提供了⼀套⽹络通讯的框架;另外还⽀持线程、进程和 IPC。
附录A C程序的基本开发过程C语言程序开发涉及到四个过程:编辑、编译、连接、装载并运行。
这些单词所表达的意义我们可以慢慢体会,下面首要的是学会依葫芦画瓢,学会按照下面的方法在VC++环境下建立一个工程、编辑源文件、编译、调试、装载并运行程序。
在Windows操作系统下,VC++环境的基本使用方法如下,详细的调试方法可参阅相关资料,或者参阅微软MSDN帮助文件。
A.1 安装程序VC++环境的安装请参阅相关的安装程序说明。
双击setup文件,然后根据提示,一路next就可以了。
A.2 新建一个工程、新建一个源文件、添加源文件到工程1.首先请在F盘(或其他盘)上建立文件夹TEST,以便将待建的C程序工程文件project 等相关文件放置在该文件夹中。
2.新建一个工程project首先鼠标左键单击“文件”菜单,选择“新建”单击鼠标左键,系统将弹出一个窗口,单击“工程”选项,将得到图A.1所示窗口。
请在“位置”栏填入刚才所建的目录F:\TEST (可以是自己设定的其他目录),并在“工程名称”栏填入project(可以是自己命名的其他工程名),然后鼠标左键单击左边窗口倒数第三项“Win32 Console Application”,使该项变蓝,然后鼠标左键单击“确定”按钮。
得到图A.2所示窗口,选择“一个空工程”,单击“完成”得到图A.3。
再单击“确定”得到图A.4所示的窗口,鼠标左键单击右下角的“FileView”字样,再单击project files左边的“+”号,在其下面的工作空间将出现三个文件夹:“Source Files”、“Header Files”、“Resource Files”,如图A.5所示(此时尚无浮动菜单)。
图A.1图A.2 图A.3图A.4图A.53.新建一个源文件hello.c要新建一个C程序源文件可以选择“文件”菜单的“新建”选项,在弹出的窗口中选择“文件”选项单击,得到如图A.6所示的窗口,其“位置”栏中的内容是默认的,在“添加到工程”前打勾,“工程名”project也是默认的,但“文件名”一栏中的内容需要自己填写,且必须是以.c为后缀,比如图中的 hello.c(注:该栏的内容一定要以.c为后缀,否则系统会默认为.cpp,这样编译时就会调用C++的编译器,而我们需要调用C语言的编译器)。
C++库⼤全基础类1、 Dinkumware C++ Library参考站点:P.J. Plauger编写的⾼品质的标准库。
P.J. Plauger博⼠是Dr. Dobb's程序设计杰出奖的获得者。
其编写的库长期被Microsoft采⽤,并且最近Borland也取得了其OEM的license,在其C/C+ +的产品中采⽤Dinkumware的库。
2、 RogueWave Standard C++ Library参考站点:这个库在Borland C++ Builder的早期版本中曾经被采⽤,后来被其他的库给替换了。
笔者不推荐使⽤。
3、SGI STL参考站点:SGI公司的C++标准模版库。
4、STLport参考站点:SGI STL库的跨平台可移植版本。
5、准标准库——BoostBoost 库是⼀个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之⼀。
Boost库由C++标准委员会库⼯作组成员发起,在C++社区中影响甚⼤,其成员已近2000⼈。
Boost库为我们带来了最新、最酷、最实⽤的技术,是不折不扣的"准"标准库。
Boost中⽐较有名⽓的有这么⼏个库:Regex正则表达式库SpiritLL parser framework,⽤C++代码直接表达EBNFGraph图组件和算法Lambda在调⽤的地⽅定义短⼩匿名的函数对象,很实⽤的functional功能Concept check检查泛型编程中的conceptMPL⽤模板实现的元编程框架Thread可移植的C++多线程库Python把C++类和函数映射到Python之中Pool内存池管理Smart_ptr5个智能指针,学习智能指针必读,⼀份不错的参考是来⾃CUJ的⽂章:Smart Pointers in Boost,哦,这篇⽂章可以查到,CUJ是提供在线浏览的。
中⽂版见笔者在《Dr. Dobb's Journal软件研发杂志》第7辑上的译⽂。
c vector用法摘要:1.C++中的容器2.C vector 的定义与初始化3.C vector 的基本操作4.C vector 的常用功能5.C vector 的注意事项正文:C++是一种功能强大的编程语言,它提供了丰富的数据结构和算法,以满足各种编程需求。
在C++中,容器是一种重要的数据结构,它可以存储和管理数据。
今天我们将介绍C++中的一种常用容器——C vector。
C vector,中文名为C 向量,是C++标准库中的一个容器,用于存储同一类型的数据元素。
C vector 可以在程序运行过程中动态地调整其大小,因此它非常适合存储动态数据。
一、C vector 的定义与初始化要使用C vector,首先需要包含相应的头文件<vector>。
然后,可以使用以下方式定义一个C vector:```vector<数据类型> 变量名(容量);```其中,数据类型可以是int、float、double 等任意类型,容量表示C vector 的初始大小。
例如,定义一个存储整数的C vector:```vector<int> nums(10);```定义之后,C vector 会自动分配内存,并将所有元素初始化为0 或0.0。
二、C vector 的基本操作C vector 提供了许多基本操作,包括访问、修改、添加和删除元素等。
以下是一些常用的操作:1.访问元素:使用下标操作符[],如下:```int num = nums[i];```2.修改元素:使用赋值操作符=,如下:```ums[i] = num;```3.添加元素:使用insert() 函数,如下:```ums.insert(nums.begin(), num);```4.删除元素:使用erase() 函数,如下:```ums.erase(nums.begin());```三、C vector 的常用功能C vector 还提供了许多有用的功能,包括遍历、排序、查找等。
Code::Blocks for C/C++ NoviceChipsetCopyright (C) 2008, 2009, 2010 ChipsetPermission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".目 录封皮 (1)目录 (2)前言 (3)1. 安装Code::Blocks (4)1.1 下载 (4)1.2 安装 (4)2. Code::Blocks 的编程环境配置 (8)2.1 环境 (8)2.2 编辑器 (13)2.3 编译器和调试器 (14)3. 编写程序 (18)3.1 创建一个工程 (18)3.2 添加和删除文件 (21)3.3 编辑文件 (25)3.4 编译程序 (29)3.5 调试程序 (43)3.6 阅读别人编写的程序 (70)3.7 代码性能测试 (73)3.8 代码统计 (76)4. 附录 (77)4.1 Linux 下安装Code::Blocks (77)4.2 Mac OS X 下安装Code::Blocks (77)4.3 Code::Blocks 搭配高版本gcc 编译器 (77)4.4 安装配置boost..................................................................................................................................................79 GNU Free Documentation License (83)封底..............................................................................................................................................................................89 ...........前言用高级计算机语言,例如C、C++,编写的程序,需要经过编译器编译,才能转化成机器能够执行的二进制代码。
cppcheck源码学习Cppcheck是一个非常强大的开源C/C++静态代码分析工具,可以帮助开发者发现代码中的各种潜在问题和错误。
本文将介绍Cppcheck的一些基本原理和主要功能,并通过分析Cppcheck源码,帮助读者深入了解Cppcheck的实现细节和工作原理。
Cppcheck使用C++语言编写,源码可以从Github上获取。
Cppcheck 的主要入口是cppcheck.cpp文件,该文件定义了Cppcheck类,并包含了Cppcheck的主要逻辑。
Cppcheck类是Cppcheck的核心类,负责整个工具的控制流程和数据处理。
Cppcheck的主要工作过程可以简单地分为以下几个步骤:1. 解析源代码:Cppcheck首先通过调用Parser类,解析输入的C/C++源文件,构建抽象语法树(AST)。
2. 对AST进行遍历:Cppcheck通过调用ASTVisitor类对AST进行遍历,可以访问和处理AST中的各种节点,比如函数、变量、语句等。
3. 检查语义错误:Cppcheck通过调用各个规则类,对AST中的节点进行语义检查。
规则类是Cppcheck中定义具体规则的地方,每个规则类都会继承自Rule类,并实现了一系列方法来进行具体的规则检查。
4. 保存错误信息:在检查过程中,如果发现了错误,Cppcheck会将错误信息保存在ErrorLogger类中,以便后续的输出和展示。
5. 输出结果:最后,Cppcheck会将错误信息输出到屏幕、文件等,供开发者查看和修复代码。
在Cppcheck源码中,Parser类负责解析源代码文件,将代码生成抽象语法树。
Cppcheck通过遍历ASTVisitor类来对AST进行遍历,可以访问和处理各种节点。
通过继承ASTVisitor类,可以轻松实现对AST中节点的访问和处理。
规则类是Cppcheck中定义具体规则的地方,每个规则类都继承自Rule类,并实现了一系列用于规则检查的方法。
用Eclipse开发C/C++程序
应毅;任凯
【期刊名称】《开放系统世界》
【年(卷),期】2005(000)003
【摘要】众所周知,Eclipse主要是一个Java开发环境,但其体系结构确保了对其它编程语言的支持,它使用外部插件CDT(C/C++Development Tools)来支持C/C++的开发。
这里将介绍如何在Linux操作系统上下载和安装JDK、Eclipse和CDT,并完成一个最简单的C程序——“Hello World!”。
文中所用操作系统是Red Hat Linux9.0。
【总页数】1页(P77)
【作者】应毅;任凯
【作者单位】无
【正文语种】中文
【中图分类】TP311.52
【相关文献】
1.将传统计费系统中的IBM Unix C++程序转为PC化的Linux C++程序研究 [J], 周龙驱;谢恭辉
2.Windows C++程序员如何过渡到Symbian OS C++程序员 [J], AndyWeinstein
3.编写小型游戏程序在C++教学中的一点应用心得——编写"猜数字"游戏程序,调动学生学习C++的积极性 [J], 李可
4.《使用Eclipse开发Web应用程序》核心课程建设 [J], 亢华爱
5.《C++程序设计》——教与学的新突破,学习“C++程序设计”从此变得容易 [J],
因版权原因,仅展示原文概要,查看原文内容请购买。
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。
依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
其格式一般为: #Pragma Para其中Para 为参数,下面来看一些常用的参数。
(1)message 参数。
Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。
其使用方法为:#Pragma message(“消息文本”)当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。
假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法#ifdef _X86#Pragma message(“_X86 macro activated!”)#endif当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_ X86 macro activated!”。
我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。
(2)另一个使用得比较多的pragma参数是code_seg。
格式如:#pragma code_seg( ["section-name"[,"section-class"] ] )它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。
(3)#pragma once (比较常用)只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。
C++调用C函数的方法我们以前见到extern C这样的语句,只是简单地知道跟外部链接有关,但是没有深刻理解它的意思。
今天继续和一起学习C++调用C函数的方法吧!C++调用C函数的方法首先,为什么要使用extern C修饰符?C++调用其它语言的函数,由于编译器生成函数的机制不一样,所以需要经过特殊处理,才可以调用。
调用C语言的函数,需要在函数声明的地方语句extern C。
如果不使用该语句,在链接的时候,编译器就会报以下这种错误。
Test.obj : error LNK2019: 无法解析的外部符号 void __cdecl DeleteStack(struct _Node *) (?DeleteStack@@YAXPAU_Node@@@Z),该符号在函数 _main 中被引用。
然后是如何使用?应该怎么使用该语句呢?刚开始,我简单地在C++源文件的前面使用该语句声明,但是还是出错,而且是在编译阶段就报错。
error C2732: 链接规范与“DeleteStack”的早期规范冲突。
为什么会出现这个错误呢?因为C++源文件已经引入了C的.头文件,在头文件里,声明该函数时没有extern修饰,而这里有extern 修饰,所以冲突了。
解决的办法有两个。
第1页共9页一。
在C头文件中加上extern修饰符。
直接加,也不行。
因为C源文件也包含了这个头文件,当编译C 源文件时,就会出现错误。
所以,需要一种机制来区分是编译C还是C++文件。
方法如下:#ifdef __cplusplusextern C#endifvoid DeleteStack(Stack stack);因为在编译C++文件时,自动定义预处理器名字__cplusplus,而编译C时,没有该处理器名字。
所以只有编译C++时,才有符号extern “C”。
此外,链接指示extern C有单个和复合两种形式。
以上为单个形式,复合形式可以同时将几个函数声明为extern Cextern C {void DeleteStack(Stack stack);void PrintStack(Stack stack);void Pop(Stack stack);}加上预处理器名字如下:#ifdef __cplusplusextern C {#endifvoid DeleteStack(Stack stack);void PrintStack(Stack stack);void Pop(Stack stack);#ifdef __cplusplus}#endif二。
目录封皮 0目录 (1)前言 (2)1. 安装Code::Blocks (3)1.1 下载……………………………………………………………………………………….….…………. .31.2 安装 (3)2. Code::Blocks的编程环境配置 (7)2.1 环境 (7)2.2 编辑器 (12)2.3 编译器和调试器 (13)3. 编写程序 (17)3.1 创建一个工程 (17)3.2 添加和删除文件 (20)3.3 编辑文件 (25)3.4 编译程序 (30)3.5 调试程序 (43)3.6 阅读别人编写的程序 (74)4. 附录 (79)4.1 Linux下安装Code::Blocks (79)4.2 Mac OS X下安装Code::Blocks (80)4.3 Code::Blocks搭配高版本gcc编译器 (80)4.4 安装配置boost (82)4.5 安装配置Qt (86)特别说明 (87)前言用高级计算机语言,例如C、C++,编写的程序,需要经过编译器编译,才能转化成机器能够执行的二进制代码。
然而,把头脑中的思想转变成能够正常工作的计算机程序需要付出一定的努力和时间,因为为了让程序能够达到我们想要的结果,我们往往需要反复修改代码。
本书的目的是帮助初学者学习组织程序编码逐步隔离并发现程序中的逻辑错误。
通过本书,您可以学会怎么一步步的跟踪代码,找到问题出在什么地方,搞明白为何您的程序不能正常运行,这个过程称谓调试程序。
手工跟踪能够有效的帮助初学者找到bug出在什么位置,消除bug,让程序正常运行。
自动化的工具同样也能够帮助您跟踪程序,尤其当程序很复杂时效果更加明显,这种工具叫做调试器。
调试器能够让运行中的程序根据您的需要暂停,查看程序怎么运作的。
有些调试器是以命令行的形式工作的,较新的调试器有些具备好的图形界面,调试器能够方便的帮助您看到您定义的变量状态。
基于图形界面的调试器是集成开发环境(IDE,即Integrated Development Environment)的一部分。
本书的作用就是帮助您学习使用这种环境以便更好的掌握编程技巧。
一个调试器并不能解决您程序中出现的问题,它仅仅是一种帮助您编程的工具。
您首先应该运用您手中的纸和笔分析程序,搞清到底怎么回事,一旦确定错误大致出在什么位置,便可以用调试器观察您的程序中特定变量的值。
通过观察这些代码,可以了解到您的程序是怎么一步步执行的。
C/C++的IDE非常多,对于学习C/C++语言的朋友而言,用什么IDE可能并不重要,重要的是学习C/C++语言本身,不过,会用一款自己习惯的IDE进行程序的编写和调试确实很方便。
本书主要论述一款开源、免费、跨平台的集成开发环境Code::Blocks的安装、配置、以及程序的调试和编译等。
Code::Blocks支持十几种常见的编译器,安装后占用较少的硬盘空间,个性化特性十分丰富,功能十分强大,而且易学易用。
我们这里介绍的Code::Blocks集成了C/C++编辑器、编译器、和调试器于一体,使用它可以很方便的编辑、调试和编译C/C++应用程序。
Code::Blocks具有很多实用的个性化特性,这里只会简单介绍少数几个常用的特性。
我们希望本书能够帮助您体验编程的乐趣的同时也能帮助您提高调试和编写程序的基本功。
如欲了解更多有关Code::Blocks的信息,请访问Code::Blocks的官方网站。
1. 安装Code::Blocks1.1 下载为了安装Code::Blocks IDE,首先需要下载它们。
如果您使用的是Windows 2000 或Windows XP 或Windows Vista操作系统,从下面地址下载Code::Blocks8.02(目前来说,8.02是最新的版本)这个IDE:/codeblocks/codeblocks-8.02mingw-setup.exe以上地址下载的文件中包含了MinGW它(内嵌了GCC编译器和gdb调试器)如果您仅仅希望把Code::Blocks当作编辑器使用,或者打算自己配置编译器和调试器的话,可以下载不带MinGW的版本,到下面的地址去下载。
/codeblocks/codeblocks-8.02-setup.exe本书的作者建议初学C/C++的朋友下载内置MinGW的版本,这样不致于花费太多时间配置编译器和调试器,从而把大部分时间用于学习调试和编写程序。
待将来您熟悉了Code::Blocks,再搭配高版本的MinGW或者其它编译器一起使用。
如果您使用Mac OS X 或Linux操作系统,请参阅附录A中的安装说明。
1.2 安装安装过程可以参照如下步骤进行(以在笔者的英文版Windows XP Professional SP2操作系统上安装Code::Blocks8.02为例)。
运行下载后的安装文件进入左下图界面。
再用鼠标点击Next按钮,可以进入下图界面。
用鼠标选择I Agree按钮,进入如下图界面。
选择全部安装(Full: All plugins, all tools, just everything),见上图,再点击Next按钮,进入一个新界面,如下图。
点击Browse…按钮选好安装路径(默认安装路径为C:\Program Files\CodeBlocks),用鼠标选择Install 按钮,可以看到安装过程正在进行,并弹出一个对话框,见下图。
用鼠标选择No按钮,则对话画框关闭,见下图。
用鼠标选择Next按钮,进入界面见下图。
最后用鼠标选择Finish,则安装过程就完成了。
2. Code::Blocks编程环境配置第一次启动Code::Blocks,可能会出现如下对话框,告诉您自动检测到GNU GCC Compiler编译器,用鼠标选择对话框右侧的Set as default按钮,然后再选择OK按钮,见下图。
假如您的Code::Blocks安装正确的话,接下来就进入Code::Blocks的主界面,但是会弹出一个标签为Tips of the Day的小对话框,见右下图。
把Show tips at startup前面的勾去掉,然后选择Close,这样下次启动就不会再出现这个小对话框。
进入Code::Blocks主界面,选择主菜单Settings,弹出一个窗口,见左上图。
然后我们就可以分别对环境(Environment…),编辑器(Editor…),编译器和调试器(Compiler and debugger…)三个子菜单进行配置了。
2.1 环境选择主菜单Settings下的第一个子菜单Environment…,会弹出一个窗口,用鼠标拖动左侧的滚动条,可以见到很多带有文字的图标。
这些下面带有文字的图标代表了不同的功能按钮。
2.1.1 配置帮助文件拖动滚动条,用鼠标选择这个图标,见右图。
此时会会出现一个对话框界面,见下图。
然后可以添加一些我们可能需要的帮助文件。
我们编写基本的C/C++应用程序,仅需要知道C/C++的库函数用法就可以了。
如果您没有C/C++语言库函数的文档,请到/Files/Chipset/cppreference.zip去下载C++ Reference,解压后放到Code::Blocks目录下(也可以放到别处),以便添加进来编程时方便查阅。
可以按照如下步骤进行添加:(1) 添加文件用鼠标点击右上侧的Add按钮,得到对话框见右图。
(2) 键入帮助文件题头给添加的文件取一个题头名,该名字可以跟实际文件名相同,也可以不同,然后选择OK按钮,又弹出一个对话框见右图。
选择Yes按钮,进入下一步,见下图。
(3) 选择需要打开的文件找到帮助文件的路径,选中帮助文件cppreference.chm,然后选择Open就又回到了刚进入Help files 的对话框,只不过多了一行字C++ Reference,见下图。
并且有刚加载的文件cppreference.chm的对应路径。
可以继续按照上述步骤添加更多帮助文件,也可以用右上侧的按钮Rename对题头C++ Reference进行改名或者用Delete按钮删除此题头。
(4) 使帮助文件可用为了方便使用,选中C++ Reference并用鼠标在下面的标签This is the default help file (shortcut: F1)前面的小方框中打勾,见上图,然后再用鼠标点击下面的OK按钮。
(5) 测试帮助文件是否可以成功加载进入Code::Blocks(如果刚才您未退出Code::Blocks就无需再重新进入),选择主菜单Help下的C++ Reference F1按钮,如右图。
或者按下F1快捷键,就可以成功加载刚才设置需要加载的帮助文件cppreference.chm了。
经过上述这些设置后,Code::Blocks就可以成功加载帮助文件了,按下F1快捷键或菜单Help下的按钮C++ Reference F1会弹出这样的一个界面,见下图。
假如我们需要查阅标准的C++库函数,可以选择左侧的Index或Search按钮键入函数名进行查询。
如果您使用的电脑已经联网,在左上部空框内键入要查询的函数名,再用鼠标点击右侧Search按钮就可以进行网上查询。
2.1.2 自动保存编写或者调试程序的过程中偶尔出现断电,如果没有后被电源,此时可能会丢失部分程序内容。
为此,我们需要设置Code::Blocks能自动保存功能所对应的选项。
进入Code::Blocks后,选择主菜单Settings下Environment…子菜单,弹出一个对话框,用鼠标拖动左侧的滚动条,找到如右图标。
选中它,界面如下图。
分别设置自动保存源文件和工程的时间,例如均为15分钟,见上图中红色框中部分。
Method为保存文件的方法,有三种,分别是Create backup and save to original file, Save to original file, 以及Save to .save file。
选择最后一个,Save to .save file就可以了,设置完毕后,选择OK按钮。
2.2 编辑器编辑器主要用来编辑程序的源代码,Code::Blocks内嵌的编辑器界面友好,功能比较完备,操作也很简单。
2.2.1 通用设置启动Code::Blocks,选择主菜单Settings下的子菜单Editor…会弹出一个对话框,默认通用设置General settings栏目,选中一些选项如右下图。
然后设置字体,字体设置首先选择右上角的Choose按钮,会弹出一个对话框,对话框主要有三个竖向栏目,最左侧的栏目Font:用来选择字体类型,选择Courier New,中间栏目Font style: 是字体样式,选择Regular, 最右边的栏目Size:是文字大小,根据个人习惯和电脑显示器显示面积大小进行选择,一般10~12,其它选项不变。