月度归档:2011年12月

C语言中的预处理指令

C语言中的预处理指令可以分为三类,文件包含,宏替换,条件编译。
(1)文件包含
文件包含是#include “stdio.h”和,#include 。两者的区别是,后者先在当前目录内寻找需要包含的文件,然后再去标准文件库中查找。
前者是只在标准文件库中查找。
(2)宏替换
宏替换,简单宏替换
#define M 5
带参数的宏替换
#define M(x) x*x
宏替换的嵌套
#define M(x) x*x
#define N(x) (M(x)*M(x))
取消定义宏指令 #undef M(x)
其中宏替换只做单纯的字符串替换,可能会对运行顺序造成一定的影响。比如说下边的例子
#define M 8+8
#define N 6-2
而在程序中出现这么一句。
int a = M-N;
编译器认为是
int a = 8+8-6-2;
结果是8,而不是想象中的12。
(3)条件编译
选择编译只有那么几个指令:
#ifndef MYDEF
#define MYDEF 15
#endif
如果没有定义 MYDEF,那么给他一个定义。
选择执行,调试程序时可用:
main(){
#ifdefine DEBUG
{
//debug code
}
#else
{
//running code
}
#endif
}

其他预处理指令:
#elif 和#if #ifndef 结合使用,组成if else结构
(4)特殊的替换
还有两种特殊的宏替换,#字符串链接运算符,##字符串粘贴运算符。其中第一个后边一定是一个字符串。
第二个是将两个变值连成一个字符串。两者都将忽略掉空格。
字符串连接运算符 #将忽略掉变量和引号之间的空格
#define sum(xy) printf(#xy “=%f\n”,xy)
sum(a + b)
转换成为printf(“a + b” ” = %f \n “,a+b);
又等价于
printf(“a + b = %f\n”,a+b)

标记粘贴运算符:## 忽略空格
用于将两边的部分连成一个字符串,比如:
#define combine (s1,s2) s1##s2
printf( “%f”, combine(total,sales) );
将被转化成为
printf( “%f”, totalsales); 这样需要出现totalsales变量
另一个定义:
#define print(i) printf(“a” #i “=%f”, a##i);
print(5) 将被转化成为printf(“a5 = %f”,a5);

#error 指出编译时候出现的错误信息

零与一的命运

我们本来就是一个一个的字节,甚至于刚开始连自己的位置都找不到。
我们不知道我们代表了什么,我们不知道我们起着什么作用。
我们就是这么一组字节码!
我想我们唯一的优点就是占据的内存空间较小,我们对电量的要求很低,我们合起来,甚至于连一个int类型的最大值都比不了。
更不用谈去统治我们梦想的数据帝国了,等不到敌人打过来,也许我们就淹没了。
我们的CPU也许将被烧毁,内存硬盘也将不复存在。
我们是很弱小。
但是,弱小的字节并不代表着消逝,仅仅几个字节,我们也可以启动一个进程,进而通过fork升级到daemon进程。我们需要屏蔽掉kill信号,处理所有的异常。
然后一直运转下去,只要我们这几个字节很完美,我们这个daemon进程很完美。
那么,
我们就可以吸收新的字节进来。
1byte
1B
1KB
1GB
……
这里都是我们渴望的,我们希望的,
当然绝对不是空想,
绝对不是单纯的梦想。
他们就在我们的身边。
从身边开始,
泛洪的方式无限扩展。
我们要加油!

ubuntu gtk 配置与hello world

配置相当简单,只需要在前边配置c和c++的基础上,安装一个gnome-core-devel就可以了,里面集成了很多其他的包。除此之外还要转一些其他的东西,如libglib2.0-doc、libgtk2.0-doc帮助文档,devhelp帮助文档查看,glade-gnome、glade-common、glade-doc图形界面设计等。

直接运行:

sudo apt-get install gnome-core-devel
sudo apt-get install libglib2.0-doc libgtk2.0-doc
sudo apt-get install devhelp
sudo apt-get install glade-gnome glade-common glade-doc

然后写下gtkhello.c

#include<gtk/gtk.h>
void hello(GtkWidget *widget,gpointer data)
{
g_print("Hello Ubuntu!\n");
}
gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
{
g_print ("delete event occurred\n");
return(TRUE);
}
void destroy(GtkWidget *widget,gpointer data)
{
gtk_main_quit();
}
int main( int argc, char *argv[] )
{
GtkWidget *window;
GtkWidget *button;
gtk_init (&argc, &argv);
window=gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(delete_event),NULL);
gtk_signal_connect (GTK_OBJECT (window), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
button = gtk_button_new_with_label ("Hello Ubuntu!");
gtk_signal_connect (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (hello), NULL);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (gtk_widget_destroy),GTK_OBJECT (window));
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (button);
gtk_widget_show (window);   /*显示一个窗口*/
gtk_main();   /*进入主循环*/
return(0);
}

用gcc编译,
gcc gtkhello.c -o gtktest `pkg-config –cflags –libs gtk+-2.0`
然后运行./gtktest,看到窗口了吧?