GetModuleFileNameA、强制转换的介绍
今天总结的几个没联系的小函数:
1、getmodulefilenamea函数的功能 //获取当前工程直到.exe的绝对路径的字符串 如果没找到就返回0
但是到底nameA和nameW有什么区别呢:可以看他们的源码如下:
此处省略一些。。
GetModuleFileNameA(
__in_opt HMODULE hModule,
__out_ecount_part(nSize, return + 1) LPSTR lpFilename,
__in DWORD nSize
);
WINBASEAPI
DWORD
WINAPI
GetModuleFileNameW(
__in_opt HMODULE hModule,
__out_ecount_part(nSize, return + 1) LPWSTR lpFilename,
__in DWORD nSize
);
#ifdef UNICODE
#define GetModuleFileName GetModuleFileNameW
#else
#define GetModuleFileName GetModuleFileNameA
所以我们可以看出他们俩的区别在于对字符集的支持不一样而已:
在Visual C++.NET的所有编程方式中,BSTR、LPSTR以及LPWSTR这样的一些基本字符串类型是什么意思呢?
BSTR(Basic STRing)是一个OLECHAR*类型的Unicode字符串。BSTR实际上就是一个COM字符串,但它却在自动化技术以外的多种场合下得到广泛使用。其中DWORD值是字符串中实际所占用的字节数,且它的值是字符串中Unicode字符的两倍。
LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型。LPSTR被定义成是一个指向以NULL(‘/0’)结尾的8位ANSI字符数组指针,而LPWSTR是一个指向以NULL结尾的16位双字节字符数组指针
2、string的几个成员函数。
int find_first_of(char c, int start = 0):查找字符串中第1个出现的c,由位置start开始。如果有匹配,则返回匹配位置;否则,返 回-1.默认情况下,start为0,函数搜索整个字符串。
int find_last_of(char c):查找字符串中最后一个出现的c。有匹配,则返回匹配位置;否则返回-1。该搜索在字符末尾查找匹配,所以没有提供起始位置。
string str = "Mississippi";
int index; // 's ' 在index 为 2、3、5、6处出现
index = str.find_first_of('s',0); // index为 2
index = str.find_first_of('s',4); // index为 5
index = str.find_first_of('s',7); // index为 -1
// ‘s’的最后出现在 index= 6
index = str.find_last_of('s');
3、Substr函数:basic_string::substr
basic_string substr(size_type _Off = 0,size_type _Count = npos) const;
功能:从一个字符串复制一个从指定位置开始,并具有指定长度的子字符串。
参数_Off:指的是所需的子字符串的起始位置。字符串中第一个字符的索引为 0,默认值为0.
_Count:指的是复制的字符数目
返回值:一个子字符串,从其指定的位置开始
如果 length 为 0 或负数,将返回一个空字符串。如果没有指定该参数,则子字符串将延续到字符串的结尾
4、boost::filesystem::path exe_name;用boost定义一个文件路径对象。has_parent_path
是path对象的一个成员函数。用来判断exe_name是否存在父目录如果存在 返回ture 否则返回false。
Parent_path 是获得父目录路径。
5、显示类型转换:static_cast:基本和以前c语言的强制类型转换一样一般编译器执行的任何隐式类型转换都可由static_cast显示完成。如果编译器不提供转换。也可以用。比如void * p=&d;double * dp =static_cast<double *>(p)
reinterpret_cast主要是用来转换指针类型的。是对原来指针类型的复制。。int *n= new int ;
double *d=reinterpret_cast<double*> (n);在进行计算以后, d 包含无用值. 这是因为 reinterpret_cast 仅仅是复制 n 的比特位到 d, 没有进行必要的分析。我觉得百度百科上解释很好
static_cast和reinterpret_cast的区别主要在于多重继承,比如
class A
{
public:
int m_a;
};
class B
{
public:
int m_b;
};
class C : public A, public B {};
那么对于以下代码:
C c;
printf("%p, %p, %p", &c, reinterpret_cast<B*>(&c), static_cast <B*>(&c));
前两个的输出值是相同的,最后一个则会在原基础上偏移4个字节,这是因为static_cast计算了父子类指针转换的偏移量,并将之转换到正确的地址(c里面有m_a,m_b,转换为B*指针后指到m_b处),而reinterpret_cast却不会做这一层转换。
总结一句 也就是说B* b=reinterpert_cast<B*>(&c)后 b其实指向的还是C类型的。。
ps几句生活上的:今天把西电的房也退了房东还答应退我定金。。哈哈。也写了博客。真好。生活真美好。虽然没考上研不过我还是很勇敢。如果国家线真的不降 那我到时候再伤感吧。。先逍遥几天。。