①
do
{
if()
break;
if()
break;
}while(false);
这样做事为了避免大量的嵌套语句
②
Pimpl机制是Private Implementation的缩写,我们常常听到诸如“不要改动你的公有接口”这样的建议,所以我们一般都会修改私有接口,但是这会导致包含该头文件的所有源文件都要重新编译,这会是个麻烦事儿。Pimpl机制,顾名思义,将实现私有化,力图使得头文件对改变不透明。
机制分析
首先,我们先看看不使用这个机制的一个实现:
- // MyBase.h
- class MyBase {
- public:
- int foo();
- };
- // MyDerived.h
- #include "MyBase.h"
- class MyDerived : public MyBase {
- public:
- int bar();
- };
假设你现在希望在MyBase.h中加入一个新的private和protected成员函数,那么MyDerived和所有包含MyBase.h的源文件都需要重新编译。在一个大工程中,这样的修改可能导致重新编译时间的激增。你可以使用Doxygen或者SciTools看看头文件依赖。
(看来,这种方式主要是用在继承中)
③ 强制for循环一致性
int main(int, char*)
{
for( int i = 0; i < 10; i++);
i = 20;//如果强制一致性,此时i就无效,语句报错,否则正常运行
}
4.一个以前没有想过的问题
wchar_t wszAr[] = "hello"; // error
wchar_t wszAr[] = {'h', 'e', 'l', 'l', 'o', '\r', '\n'};// ok
wcslen(wszAr) = 5
5
void test(char *dest, int len, const char* format, ... )
{
va_list args;
va_start( args, format );
_vsnprintf(dest, len, format, args);
va_end(args);
}
void main()
{
char ar[32];
test( ar, 32, "%d,%s", 10, "my");
std::cout << ar << std::endl;
}
6.
void test(char *dest, int len, const char* format, ... )
{
va_list arg_ptr;
va_start( arg_ptr, format );
char* argValue = NULL;
do
{
argValue = va_arg(arg_ptr, char* ); //若...都是char*,则可遍历出各个参数
std::cout << argValue << std::endl;
}while( argValue != NULL );
}
7.
wchar_t value[512] = L"hello";
wcslen(value) = 5; //长度
sizeof(value) = 1024; //大小
初始化:
memset(value, 0, wcslen(value)*sizeof(wchar_t)) 或
memset(value, 0, sizeof(value));
别搞混了
宽字符与多字符集转换时:
int len = 0;
len = ::WideCharToMultiByte(CP_ACP, 0, wp, wcslen(wp), NULL, 0, NULL, NULL);
char *p = new char[len+2]; //len不包含'\0'结束符,所以要加2
memset(p, 0, len+2);
::WideCharToMultiByte(CP_ACP, 0, wp, wcslen(wp), p, len, NULL, NULL );