微信公众号: 星点课堂
新浪微博:女儿叫老白
网易云课堂:女儿叫老白
-------------------------------------------------------------------------------
说到C++中的C,我一下想到的就是extern C。用途是zaidll中声明一个动态引出接口,当程序运行时可以动态加载该dll,搜索其中的引出接口,并且进行调用。比如:
// header.h of dll
extern "C"
{
CExport_TablePlugin IPluginEntry* createEntry();
};
// imp.cpp in dll
extern "C"
{
/// 创建插件实体
CExport_TablePlugin IPluginEntry * createEntry()
{
return new CTablePlugin();
}
};
上述代码中,在header.h中声明了dll的一个引出接口createEntry(),它返回一个IPluginEntry*类型的指针。在imp.cpp中提供了该引出接口的实现。
在其他代码中,就可以用库函数加载该dll,然后搜索解析该接口,并调用。
基本的语法中,需要提醒大家的是goto语句,一定要慎用。因为他可能导致意想不到的跳转,进而引发未知错误。
定义完变量,请一定要初始化呀。
运算符及其优先级是经常用到的C++技术。但是我们可能不太容易把运算符的优先级记得这么清楚。因此,小编推荐用括号来明确指定优先级。举一个简单例子:
a = b>c ? b : c;
最好改为:
a = (b>c?b:c);
否则,编译器会识别为:
(a=b) ?> c ? b : c;
那就错啦。
自增和自减操作,是经常用到的。我们也可以把它用在迭代器上,比如:
vector<int>::iterator ite = v.begin();
for (; ite!=v.end(); ite++) {
if ((*ite) == 3) {
v.erase(ite++);
} else {
ite++;
}
}
上述语句就充分利用了自加操作的语法特性。自加操作是先取变量值,后进行自加。因此,取出迭代器的值进行使用后,再对迭代器自加,就可以在删除迭代器当前指向的成员后,仍能够保持迭代器指向正确的成员。
基本数据类型中,比较难学的就是指针。在通过函数参数传入指针,并希望在函数内部修改指针指向的地址时,一定要记得取指针地址传入吆。
指针和引用在执行功能上类似。不同之处是引用是对象看上去更易懂,而使用指针的话,就要使用->语法,使得代码看上去有点不太易懂。
全局变量与局部变量:在函数体外部定义的变量默认是全局的。除非我们加上static修饰,这时它就变成局部变量了(也就是仅在本cpp内可见)。被声明为static的变量,在其他cpp中即使用extern声明,编译器也无法找到它,因为它是局部的。
我们可以用define语句来定义常量,但是如果有错误,编译器是无法在编译期间发现错误的,需要等到运行时,但是那就晚了。因此,小编倾向于使用常量变量来定义常量值。比如
#define PI 3.1415927
可以改为:
static double s_PI = 3.14159278.f;
这样,在代码中使用s_PI,效果上与宏定义是一样的。
我们可以用#ifdef DEBUG来进行预处理判断,以便在程序编译期决定代码的运行走向,当然也可以在程序运行期决定,比如可以通过main()函数的入口参数决定
int main(int argc, char * argv[]) {
bool bDebug = false;
for (int i=0; i<argc; i++) {
if (string(argv[i] == “--debug”) {
bDebug = true;
}
}
if (bDebug) {
……
}
}