65.9K
CodeProject 正在变化。 阅读更多。
Home

快速启动 C/C++ 项目

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (5投票s)

2009 年 4 月 23 日

CPOL

3分钟阅读

viewsIcon

19396

downloadIcon

203

跳过“从头开始”和 Makefile 的废话,这将激发您的创造力

引言

PEP 是一个小的 C++ 跨平台框架生成器,可以为您的 C++ 工作流程提供一些速度!
它将输出一些基本的类,您就可以开始了!
对于你们中的一些程序员来说,这篇文章可能很有趣。

警告:我是荷兰人,所以请享受本文中的语言 :)   

场景

您还记得那些“嘿,让我们为这个想法编写一个小的非 IDE C/C++ 程序”的感觉吗?
这些感觉不是很美妙吗?:)
好的,所以您打开您最喜欢的 Drum'N'Bass CD(或您喜欢的音乐),然后您充满热情地开始。
但是很快,这些感觉就被编写跨平台 Makefile、单例、目录、配置……而不是编写真正的代码而破坏了!:(
自从我厌倦了这些“扼杀创造力的任务”之后,我开始编写这个,所以现在我们可以立即开始编码我们的想法了! 

这一切都归结为这个小的 shell 脚本命令: 

kn0r pep # ./pep
  Usage: pep <project name> <target directory> 

要求 

只需要一个编译器、安装的 svn 和一个 Unix 环境即可。
(在 GNU gcc/DevCpp/Mingw32/Cygwin 编译器上测试过)

特点

  • shellscript:PEP shell 脚本会自动将 PEP 框架的所有类重命名为您的项目名称
  • .ini 解析器:轻松读取/写入.ini文件并在应用程序中使用
  • 框架:您将获得一个带有单例的基本工作跨平台骨架来启动
  • 断言:在运行时,您可以使用 '_assert()' 函数更轻松地找到错误
  • outputclass:使用 '_()' & '_say()' 函数轻松调试变量,也会记录到 'log.txt'
  • memoryleaks:释放内存泄漏!(开玩笑)如果启用 compilerflag -DDEBUG 标志,您将获得关于您的应用程序内存泄漏的有用信息 
  • Makefile 不同平台的模板(也有一个DevCpp 项目文件)

使用方法  

好的,获取 zip 文件,让我们在 Linux 提示符下执行以下操作

kn0r pep # ./pep myproject myproject
[x] creating directory
[x] getting hottest source in town!
A    myproject
A    myproject/COMPILING
A    myproject/src
A    myproject/src/pep
A    myproject/src/pep/ini.cpp
A    myproject/src/pep/output.cpp
A    myproject/src/pep/ini.h
A    myproject/src/pep/pep.cpp
A    myproject/src/pep/global.h
A    myproject/src/pep/output.h
A    myproject/src/pep/pep.h
A    myproject/src/main.cpp
A    myproject/src/debug.cpp
A    myproject/bin
A    myproject/bin/pep.ini
A    myproject/bin/data
A    myproject/obj
A    myproject/prj
A    myproject/prj/Makefile.dreamcast
A    myproject/prj/pep-DevCpp.dev
A    myproject/prj/configure
A    myproject/prj/configure.ac
A    myproject/prj/Makefile.inc
A    myproject/prj/Makefile.macosx
A    myproject/prj/Makefile.windows
A    myproject/prj/Makefile.linux
A    myproject/README
Exported revision 7.
[x] Unzipping  module.
[x] Preparing files 'myproject'
[x] Preparing files 'myproject'
[x] Preparing files 'myproject'
[x] Preparing files 'myproject'
[x] Preparing files 'myproject'
[x] Preparing files 'myproject'
[x] Preparing files 'myproject'
[x] install completed.		 

好的……您可能在想“那是什么?”
好吧,非常简单,源文件被提取,文件被重命名为“myproject”。
让我们看看我们刚刚创建的目录“myproject

|-- INSTALL                         <- documentation about how to compile
|-- README                          <- this document
|-- bin                             <- the binaries will be put here
|   |-- data                        <- a directory where application files can be located
|   |-- [log.txt]                   <- debug information will be stored here
|   |-- [myproject]                 <- linux binary
|   |-- [myproject.bin]             <- dreamcast binary
|   `-- [myproject.exe]             <- windows binary
|-- obj                             <- here the .o files are stored
|-- prj
|   |-- Makefile.dreamcast
|   |-- Makefile.inc                <- here the .cpp can be specified for the 
							GNU style compilers
|   |-- Makefile.linux
|   |-- Makefile.macosx
|   |-- Makefile.windows
|   |-- configure
|   |-- configure.ac                <- starting point for autotools
|   `-- myproject-DevCpp.dev        <- devcpp project file
`-- src
    |-- debug.cpp                   <- here the memory leak checking is done
    |-- main.cpp
    `-- myproject
        |-- global.h
        |-- output.cpp              <- class for logging and outputting variables
        |-- output.h
        |-- ini.h                   <- class for read/writing ini files
        |-- ini.cpp
        |-- myproject.cpp
        `-- myproject.h             <- the 'core' engine, a basic singleton


btw. files between the [ ] are generated after the first compile

现在……让我们看看我们的main 函数

int main(){
  string str;
  int done = 1;
  myproject *p = myproject::get();

  _say( "Welcome to '%s'", p->config->GetValue( "settings", "appname" ).c_str() );
  _( TRACE("outputting some debug info%i"), done );
  _( ERROR("triggering an error! %i"), done );
  _( WARNING("triggering a warning %i"), done );
  _( FATAL("triggering some fatal error %a, immediate exit!"), done );

  _assert( p != 0, "p must not be null" );
  _assert( p == 0, "p must be null" );

  p->config->SetValueI( "settings", "somesetting", 1234 );
  p->config->WriteFile();

  delete p;
  _say("all done", 0);
  return 1;
}

基本上发生的是:首先创建 myproject-engine 对象(通过单例),然后我们将一些数据发送到我们的 outputclass。之后我们做一些断言,这是方便的开发者工具。最后,我们将一些东西写入.ini文件并进行清理。

您一定在想……_( ) 函数是怎么回事?好吧,我们这样做是为了显示额外的调试信息。只需查看此输出

kn0r myproject # cd prj/
kn0r prj # make -f Makefile.linux all
c++  -DDEBUG -DLOG -c ../src/main.cpp -o ../obj/main.o -DDEBUG -DLOG
c++  -DDEBUG -DLOG -c ../src/myproject/output.cpp -o ../obj/output.o -DDEBUG -DLOG
c++  -DDEBUG -DLOG -c ../src/myproject/myproject.cpp -o ../obj/myproject.o -DDEBUG -DLOG
c++  -DDEBUG -DLOG -c ../src/myproject/ini.cpp -o ../obj/ini.o -DDEBUG -DLOG
c++  -DDEBUG -DLOG -o ../bin/myproject 
	../obj/main.o ../obj/output.o ../obj/myproject.o ../obj/ini.o  -lm
kn0r prj # cd ../bin
kn0r bin # ./myproject
myproject> Welcome to 'myApplication v1.0'
myproject> [TRACE@../src/main.cpp:30] outputting some debug info1
myproject> [ERROR@../src/main.cpp:31] triggering an error! 1
myproject> [WARNING@../src/main.cpp:32] triggering a warning 1
myproject> [FATAL@../src/main.cpp:33] triggering 
	some fatal error 0x0.0000000000001p-1022, immediate exit!
myproject> [ASSERTION@../src/main.cpp:36] p must be null
myproject> delete myproject!
myproject> all done
0xb7f40e54
*** WARNING:  GCC 3 or later is detected
delete: freed 0x8058048 (size 893, 0 bytes still allocated) 

背景

每次我开始一个针对不同平台的项目时,我发现自己一次又一次地编写相同的“从头开始”的东西。
在许多情况下,远离大型 GUI IDE 是明智的。
我发现,当我开始使用命令行 GCC 进行开发时,移植到 Windows 比反过来更容易。
但是……命令行的东西有其缺点……编写 Makefile 非常费力,即使使用 Makefile 生成器也是如此。
我厌倦了一遍又一遍地编写相同的东西……所以我决定编写这个基本的框架生成器,以保持它的简单。   

鸣谢 

  • Tim Gerritsen (gloomy)
  • Leon van Kammen (sqz)
  • IZI-Services
  • 感谢 Wu Yongwei 的精彩“nvwa”C++ 实用程序
  • Adam Clauss & Shane Hill - 感谢他们出色的跨平台 ini 文件读取器/写入器

历史

  • [20-11-2008] v1.0 第一个草图 
  • [23-04-2009] v1.1 添加了 inifile 并修复了小错误
© . All rights reserved.