找回密码
 立即注册
收起左侧

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

2
回复
6734
查看
[复制链接]
累计签到:41 天
连续签到:1 天
来源: 原创 2018-9-4 10:34:22 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

版权声明
---------------------------------------------------------------------------------------------------------------------
该文章原创于Qter开源社区(www.qter.org
作者: 女儿叫老白 (白振勇)
转载请注明出处!
---------------------------------------------------------------------------------------------------------------------
本套课程属于:《C++跨平台开发干货》系列课程。
-----------------------------------------------------------------------------

引言
-----------------------------------------------------------------------------
       现在我们都用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) {
……
}
}
回复

使用道具 举报

累计签到:50 天
连续签到:1 天
2018-10-27 19:44:27 显示全部楼层
老师好,     在header.h中声明了dll的一个引出接口createEntry(),它返回一个IPluginEntry*类型的指针。在imp.cpp中提供了该引出接口的实现。
CExport_TablePlugin  IPluginEntry* createEntry();   老师这个CExport_TablePlugin 这个是什么,   是c++里面的关键字吗?  把代码复制到编辑环境里提示出错?

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

点评

这里的CExport_TablePlugin是个宏定义,用来在widows上声明dll引出接口或者引出类。具体作用可以参考 KS04-01 exe+dll编程  详情 回复 发表于 2018-10-27 20:07
回复 支持 反对

使用道具 举报

累计签到:41 天
连续签到:1 天
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编程  
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了