最近要挂了,写一点东西来记录自己这么多天来踩的坑。
就今天来说:
字符串和指针某些用途
不知为何,我在某些地方尝试使用了char a[] = “xxx”,然后在传递指针的时候直接传递a,传递成功了,但是这样子的数据在有文件流输入的时候突然就失败。
然后使用char * a = “xxx”这样的形式,从而完成
在编译的时候,这样会报从定值字符串到char的警告,可以忽略。我当时因为想优化这个东西,把所有的都改写成了数组形式,编译没问题,但是后来就发现这个文件名变成了乱码,类似于”\300\257”这些倒头玩意儿,坑。怪不得GPGPU-Sim原作者写的从来都是直接指针,报警告也不用数组,不知道为啥。
个人猜测可能和cache有关。
字符串与布尔变量
最简单的样例
‘’’
#include
#include
using namespace std;
void exe(bool flag)
{
if(flag)
{
cout<<”bool, right!”<<endl;
}
}
void exe(string content)
{
cout<<content<<endl;
}
int main(void)
{
char s1[] = “All that matters is time.”;
exe(s1);
}
‘’’
nnd字符串居然这么容易就被当成布尔变量了,丢人的string,你看别人重载就不找属于自己的函数了?
\n与\r\n
这个东西只有在windows于linux下互相传输文本文件时候会出现,事实上windows下的换行是\r\n,linux下是\n,因为\r代表的意思是回到一行的开始,所以你如果用一个windows下的文本直接在linux下cat是会出现沙雕乱码的,这个也把我给搞的不行。
编译链接
这个其实是很难的一部分知识,发现国内很多学校都没有涉及。。。。
最简单的,所有.cc文件,或者.c,如果用g++/gcc进行编译的话,过程会先产生.o文件,然后链接所有.o文件生成二进制可执行文件,看起来很简单,但是有很多变种。
将大量.o连接起来生成静态库.a或者动态库.so,这其实都是很坑的,因为你必须弄清楚里面的依赖关系,不然你稍微换个次序,编译就会报错,https://eli.thegreenplace.net/2013/07/09/library-order-in-static-linking,这个是G++进行连接的操作逻辑,我想的是为啥不设成所有的扫描完了再扫描一遍,万一俩库相互依赖那不是凉了?
在编译过程中,如果你想添加头文件,从而让你的代码可以用更多已经被定义好的类,那你就必须在编译命令中加入-I语句,比如 -I\home\zongyi\GPGPU-Sim_dev-half2,否则你压根不能使用其他类,而且报错是在编译阶段不是在连接阶段,这不坑吗,比如这样。
我有一个文件夹,叫hello,里面包含了很多.o文件,这些.o文件是可以自己形成闭环并且拥有大量很实用的代码的,我想使用这里面的代码。我不可以直接在代码里使用,这样编译会出错。所以,我必须要知道他们的头文件和实现位置,从而一个一个Include进来,这样我的代码才能通过编译。虽然通过编译之后,我可以直接连接这些.o文件而无需再次生成他们。
常用的命令,比如nm,里面可以看到很多U,T之类的,但是有时候即便你要使用的东西是T,但是这个.o里包含了U,你就必须得找到他包含的,这 也是个坑。