为什么这些死脑筋们在用 VI ?
http://www.oschina.net/news/25882/why-they-are-using-vi?from=20120226
看起来是个好文章,不过现在我还不适合看,记下来以后看
手册
http://vimcdoc.sourceforge.net/doc/usr_01.html
Dealing with Stopped Jobs
Sometimes when you try to logout, you'll get a message saying there are "stopped jobs". These stopped jobs are programs or processes which have been suspended by a ^Z (Ctrl - Z) command. You have to either make the job active again, or get it running properly in the "background" before you can logout.
Stopping a program is useful if you want to temporarily suspend working on one program so you can do something else.
To see a list of stopped jobs, type:
You will see a list of the stopped programs. Here's an example showing a stopped "learn" session:
You can kill this stopped job by typing:
kill %1 (where %1 is the number of the job to be killed> | |
Or you can make the program active again by typing:
fg %1 (where %1 is the number of the job) | |
fg stands for foreground. (You are bringing the program from suspended status back to the foreground.) Once brought back to the foreground, you can continue the program or quit in a normal manner.
输入法切换用ctrl+shift
Ubuntu自带的输入法不太尽如人意思,用起来也不方便,我在Ubuntu和FC中都是用Fcitx,很好用!
安装配置如下:
1. 安装 fcitx
sudo apt-get install fcitx
2. 配置默认输入法为 fcitx
im-switch -s fcitx // 注意无须加 sudo
3. 重启 x-window
重启之后,fcitx 输入法应当正常启动,输入条将显示在屏幕最上面,不过输入框中文显示可能是 “口口”,需要小小的改动。
4. 修改配置文件
gedit ~/.fcitx/config
//如果没有配置gedit 支持GB18030编码,打开后文件会是乱码(此处针对9.10前版本,9.10无需配置已支持)
修改如下几项:
显示字体(中)=YaHei Consolas Hybrid //主要是看你的OpenOffice中有什么字体,加进来就行。
Enter键行为=1 # =1表示回车时清除输入框中输入的内容,随个人喜好设置
上一页=, # 使用 , . 翻页,随个人喜好设置
下一页=.
[输入法]
使用拼音=0
拼音名称=智能拼音
使用双拼=0
双拼名称=智能双拼
默认双拼方案=自然码
使用区位=0
区位名称=区位
使用码表=1
提示词库中的词组=1
其他输入法=
5. 修改码表文件
sudo gedit /usr/share/fcitx/data/tables.conf
由于五笔拼音已经完全够用,其它输入法就没必要出现了,文件中只需留下如下内容,其它配置段可以清除或注释掉。
[码表]
名称=五笔拼音
码表=wbpy.mb
调频=2
拼音=1
拼音键=z
自动上屏=-1
空码自动上屏=-1
自动词组=1
精确匹配=0
提示编码=0
6、重启 x-window
重启 x-window 之后,小企鹅输入法中文显示将完全正常,且只有“五笔拼音”,免去了在多个输入法中来回切换的麻烦。
Note: Restart 后小企鹅面板不是最上面,我们也以用[Ctrl+Alt+h]来把它调上来。
sudo apt-get install make gcc g++
再装上函数手册
sudo apt-get install manpages-dev
另一方法:
sudo apt-get install build-essential
执行完后,完成了gcc,g++,make的安装。 build-essential 是一整套工具,gcc,libc等等
函数手册的使用: 是的,比如man scanf。
偶尔会有同名的,比如printf就有两个,一个在脚本下用,一个在c里面用,可以用
这样会显示出第一个,按q退出后接着显示第二个。
当然,如果你知道你要查的帮助属于哪一类的话也可以直接加类别号,如:
代码: |
man 1 printf man 3 printf |
第一个显示的就是脚本下用的printf,第二个显示的是c的。
编译运行:
安装好后必要的工具后,运行
运行编译好的程序,用
gcc有很多参数,可以看看
或
或:
$chmod +x a.out
$./a.out
用gcc的话加-lstdc++参数
时常在cpp的代码之中看到这样的代码:
#ifdef __cplusplus
extern "C" {
#endif
//一段代码
#ifdef __cplusplus
}
#endif
这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{和}处理其中的代码。
要明白为何使用extern "C",还得从cpp中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返 回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的.
比如下面的一段简单的函数,我们看看加入和不加入extern "C"产生的汇编代码都有哪些变化:
int f(void)
{
return 1;
}
在加入extern "C"的时候产生的汇编代码是:
.file "test.cxx"
.text
.align 2
.globl _f
.def _f; .scl 2; .type 32; .endef
_f:
pushl %ebp
movl %esp, %ebp
movl $1, %eax
popl %ebp
ret
但是不加入了extern "C"之后
.file "test.cxx"
.text
.align 2
.globl __Z1fv
.def __Z1fv; .scl 2; .type 32; .endef
__Z1fv:
pushl %ebp
movl %esp, %ebp
movl $1, %eax
popl %ebp
ret
两段汇编代码同样都是使用gcc -S命令产生的,所有的地方都是一样的,唯独是产生的函数名,一个是_f,一个是__Z1fv。
明白了加入与不加入extern "C"之后对函数名称产生的影响,我们继续我们的讨论:为什么需要使用extern "C"呢?C++之父在设计C++之时,考虑到当时已经存在了大量的C代码,为了支持原来的C代码和已经写好C库,需要在C++中尽可能的支持C,而 extern "C"就是其中的一个策略。
试想这样的情况:一个库文件已经用C写好了而且运行得很良好,这个时候我们需要使用这个库文件,但是我们需要使用C++来写这个新的代码。如果这个代 码使用的是C++的方式链接这个C库文件的话,那么就会出现链接错误.我们来看一段代码:首先,我们使用C的处理方式来写一个函数,也就是说假设这个函数 当时是用C写成的:
//f1.c
extern "C"
{
void f1()
{
return;
}
}
编译命令是:gcc -c f1.c -o f1.o 产生了一个叫f1.o的库文件。再写一段代码调用这个f1函数:
// test.cxx
//这个extern表示f1函数在别的地方定义,这样可以通过
//编译,但是链接的时候还是需要
//链接上原来的库文件.
extern void f1();
int main()
{
f1();
return 0;
}
通过gcc -c test.cxx -o test.o 产生一个叫test.o的文件。然后,我们使用gcc test.o f1.o来链接两个文件,可是出错了,错误的提示是:
test.o(.text + 0x1f):test.cxx: undefine reference to 'f1()'
也就是说,在编译test.cxx的时候编译器是使用C++的方式来处理f1()函数的,但是实际上链接的库文件却是用C的方式来处理函数的,所以就会出现链接过不去的错误:因为链接器找不到函数。
因此,为了在C++代码中调用用C写成的库文件,就需要用extern "C"来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。
比如,现在我们有了一个C库文件,它的头文件是f.h,产生的lib文件是f.lib,那么我们如果要在C++中使用这个库文件,我们需要这样写:
extern "C"
{
#include "f.h"
}
回到上面的问题,如果要改正链接错误,我们需要这样子改写test.cxx:
extern "C"
{
extern void f1();
}
int main()
{
f1();
return 0;
}
重新编译并且链接就可以过去了.
总结
C和C++对函数的处理方式是不同的.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明
stl string 里没有format
可用 stringstream 来格式化你要的东西。
http://www.cnblogs.com/lzjsky/archive/2011/01/04/1925538.html
输入输出的头文件 <iostream>
string流的头文件 <sstream>
文件流的头文件 <fstream>
stringstream的用法
1.利用输入输出做数据转换
stringstream ss_stream;
ss_stream << i; // 将int输入流中
ss_stream >> str; // 将ss_stream中的数值输出到str中
//注意:如果做多次数据转换;必须调用clear()来设置转换模式
ss_stream << "456";
ss_stream >> i; // 首先将字符串转换为int
ss_stream.clear();
ss_stream << true;
ss_stream >> i; // 然后将bool型转换为int;假如之前没有做clear,那么i会出错
//运行clear的结果
i = 456
i = 1
//没有运行clear的结果
i = 456
i = 8800090900
2.支持char*的输入和输出
char sz_buf[20];
ss_stream << 8888;
ss_stream >> sz_buf; // 直接将数输出到sz_buf字符数组中
3.来存储可变数据的列表
stringstream ss_stream;
ss_stream << "字符串一" << endl;
ss_stream << "字符串二" << endl;
ss_stream << "字符串三" << endl;
ss_stream << "字符串四" << endl;
ss_stream << "字符串五" << endl;
char buffer[100];
while ( ss_stream.getline(buffer, sizeof(buffer))
{
printf("msg=%s\n", buffer);
}
ss_stream("");// 释放字符串流中的资源
// 或者用string来接收
stringstream ss_stream;
string stemp;
while ( getline(ss_stream, stemp) )
{
task_download(stemp.c_str(), relate.c_str());
}
函数简介
函数名: time
头文件:time.h
函数原型:time_t time(time_t * timer)
功 能: [1]获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个大整数,其值表示从UTC(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)
到当前时刻的秒数。然后调用localtime将time_t所表示的UTC时间转换为本地时间(我们是+8区,比UTC多8个小时)并转成struct tm类型,该类型的各数据成员分别表示年月日时分秒。
补充说明:time函数的原型也可以理解为 long time(long *tloc),
因为在time.h这个头文件中time_t实际上就是:
#ifndef _TIME_T_DEFINED
typedef long time_t; /* time value */
#define _TIME_T_DEFINED /* avoid multiple def's of time_t */
#endif
即long。
函数应用举例
程序例1: time函数获得日历时间。日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。
这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,
这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,
但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。
#include <time.h>
#include <stdio.h>
#include <dos.h>
int main(void)
{
time_t t;
t = time(NULL);
printf("The number of seconds since January 1, 1970 is %ld",t);
return 0;
}
程序例2:
//time函数也常用于随机数的生成,用日历时间作为种子。
#include <stdio.h>
#include <time.h>
#include<stdlib.h>
int main(void)
{
int i;
srand((unsigned) time(NULL));
printf("ten random numbers from 0 to 99\n\n");
for(i=0;i<10;i++)
{
printf("%d\n",rand()%100);
}
return 0;
}
程序例3:
用time()函数结合其他函数(如:localtime、gmtime、asctime、ctime)可以获得当前系统时间或是标准时间。
#include <stdio.h>
#include <stddef.h>
#include <time.h>
int main(void)
{
time_t timer;//time_t就是long int 类型
struct tm *tblock;
timer = time(NULL);//这一句也可以改成time(&timer);
tblock = localtime(&timer);
printf("Local time is: %s\n",asctime(tblock));
return 0;
}
Failed to initialize remote display subsystem【VMware】
错误: 启动虚拟机后弹出“Failed to initialize remote display subsystem”错误提示,点击确定后虚拟机中的操作系统关闭,无论如何也无法启动。
原因:
虚拟机在安装时自动添加了一个“__vmware_user__”帐户,不小心删掉这个帐户后虚拟机中的操作系统就会启动失败。
解决:
进入DOS命令窗口,输入“net user __vmware_user__ /add”命令添加这个虚拟机帐户即可。
//null-pointer-with-boostshared-ptr
http://stackoverflow.com/questions/621220/null-pointer-with-boostshared-ptr
http://www.cnblogs.com/lzjsky/archive/2011/09/09/2172469.html