本帖最后由 baizy77 于 2018-10-1 20:47 编辑
版权声明 --------------------------------------------------------------------------------------------------------------------- 作者: 女儿叫老白 (白振勇) 转载请注明出处! --------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------
引言 ----------------------------------------------------------------------------- 现在我们都用C++语言开发了,C++是从C语言发展而来的,那么在C++中还有哪些值得注意的C的特性呢?
正文 ----------------------------------------------------------------------------- 说到C++中的C,我一下想到的就是extern C。用途是zaidll中声明一个动态引出接口,当程序运行时可以动态加载该dll,搜索其中的引出接口,并且进行调用。比如: // header.h ofdll extern"C" { CExport_TablePlugin IPluginEntry* createEntry(); };
// imp.cpp indll 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 const 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 == “--debug”) { bDebug = true; } } if (bDebug) { …… } } |