baizy77 发表于 2018-9-4 10:34:22

C++老鸟日记009 C++中的C,掌握基本的语法、运算符及其优...

本帖最后由 baizy77 于 2018-10-1 20:47 编辑

版权声明---------------------------------------------------------------------------------------------------------------------该文章原创于Qter开源社区(www.qter.org)作者: 女儿叫老白 (白振勇)转载请注明出处!---------------------------------------------------------------------------------------------------------------------课程目录:《C++老鸟日记》目录本套课程属于:《C++跨平台开发干货》系列课程。-----------------------------------------------------------------------------
引言-----------------------------------------------------------------------------       现在我们都用C++语言开发了,C++是从C语言发展而来的,那么在C++中还有哪些值得注意的C的特性呢?
正文-----------------------------------------------------------------------------说到C++中的C,我一下想到的就是extern C。用途是zaidll中声明一个动态引出接口,当程序运行时可以动态加载该dll,搜索其中的引出接口,并且进行调用。比如:// header.h ofdllextern"C"{       CExport_TablePluginIPluginEntry* createEntry();};
// imp.cpp indllextern"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语句来定义常量,但是如果有错误,编译器是无法在编译期间发现错误的,需要等到运行时,但是那就晚了。因此,小编倾向于使用常量变量来定义常量值。比如#definePI 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) {……}}

tan 发表于 2018-10-27 19:44:27

老师好,   在header.h中声明了dll的一个引出接口createEntry(),它返回一个IPluginEntry*类型的指针。在imp.cpp中提供了该引出接口的实现。
CExport_TablePluginIPluginEntry* createEntry();   老师这个CExport_TablePlugin 这个是什么,   是c++里面的关键字吗?把代码复制到编辑环境里提示出错?

请老师帮忙解答, 我没有用到这样的dll库调用。谢谢老师。

baizy77 发表于 2018-10-27 20:07:43

tan 发表于 2018-10-27 19:44
老师好,   在header.h中声明了dll的一个引出接口createEntry(),它返回一个IPluginEntry*类型的指针。在 ...

这里的CExport_TablePlugin是个宏定义,用来在widows上声明dll引出接口或者引出类。具体作用可以参考 KS04-01   exe+dll编程
页: [1]
查看完整版本: C++老鸟日记009 C++中的C,掌握基本的语法、运算符及其优...