C++之宏、extern关键字与多线程
理解C++ 宏
1、特殊字符
考虑下面的需求,程序中多处使用文本字符串。我们知道文本字符串前后都要加上双引号,我很讨厌输入双引号。有没有好的办法呢?根据常识,使用下面的宏:
#define Str(x) "x"
String s = Str(Hello); 期望预编译为:String s = "Hello",其实这是有问题的?仔细分析一下,宏的本质是文本替换。从编译器的角度思考,哪些地方应该换,哪些地方不应该换,并不是说遇到x就替换。也就是说,对于"x",编译器认为"x"是一个整体,其中的x不是Str(x)的x。因此,String s = "x"。那么如何解决这个问题呢?
与此类似,相同道理的情况是转义字符。因此,这里也使用特殊字符。对宏变量前后加上双引号的特殊字符是:#。另外还有:
#:宏变量前后加上双引号,也就是将参数变为字符串
#@:宏变量前后加上单引号
##:进行拼接。
2、常用的宏
__LINE__ 宏在预编译时会替换成当前的行数
__FUNCTION__ 宏在预编译时会替换成当前的函数名称
__FILE__ 宏在预编译时会替换成当前的文件名
__DATE__ 编译的日期(格式"Mmm dd yyyy")
__TIME__ 编译的时间(格式"hh:mm:ss")
__TIMESTAMP__ 修改日期和时间,表示为以 Ddd Mmm Date hh:mm:ss yyyy
__STDC__ 如果编译器接受标准C,那么值为1
__VA_ARGS__ 是一个可变参数的宏
其他见:http://msdn.microsoft.com/zh-cn/library/windowsphone/develop/b0084kay.aspx
3、尽量少使用宏,而应该使用替代方法。但是有些地方,还是必须要使用宏。比如:
(#ifndef #define #endif)以及__LINE__等,为什么__LINE__也必须要使用宏?
思考:使用宏,在当前位置进行文本替换,打印出来就是当前行数。如果使用方法,那么打印出来的就是方法中一行内容的行数。
理解extern关键字
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。也就是说extern有两个作用,
第一,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载啊,在这里不去过多的论述这个问题,如果你有兴趣可以去网上搜索,相信你可以得到满意的解释!
第二,当extern不与"C"在一起修饰变量或函数时,如在头文件中: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用,记住它是一个声明不是定义!
C++多线程
pthread_create是(Unix、Linux、Mac OS X)等操作系统的创建线程的函数。它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。
#include <pthread.h> int pthread_create( pthread_t *restrict tidp, //新创建的线程ID指向的内存单元。 const pthread_attr_t *restrict attr, //线程属性,默认为NULL void *(*start_rtn)(void *), //新创建的线程从start_rtn函数的地址开始运行 void *restrict arg //默认为NULL。若上述函数需要参数,将参数放入结构中并将地址作为arg传入。 );
int pthread_join( pthread_t tid, //需要等待的线程,指定的线程必须位于当前的进程中,而且不得是分离线程 void **status //线程tid所执行的函数返回值(返回值地址需要保证有效),其中status可以为NULL );
C++之宏、extern关键字与多线程的更多相关文章
- 解决全局变量共享---C语言的extern关键字用法
在调试程序时,有一个参数需要在多个函数之间传递,因为是作为调试参数,不想将参数引入到函数中. 很自然的想到使用全局变量来表示这个公共参数,工程代码的结构如下: main.c test.c test.h ...
- C++之extern关键字
extern关键字 extern extern关键字的作用就是告诉编译器,它修饰的变量或者函数在别处定义. extern "C" 代码一: cppExample.h #ifndef ...
- (转)extern关键字两种场景的使用
第一种场景 -- extern extern关键字的作用是声明变量和函数为外部链接,即该变量或函数名在其它文件中可见.用其声明的变量或函数应该在别的文件或同一文件的其它地方定义. 例如语句:exter ...
- C/C++语言补缺 宏- extern "C"-C/C++互调
1. 宏中的# 宏中的#的功能是将其后面的宏参数进行字符串化操作(Stringizing operator),简单说就是在它引用的宏变量的左右各加上一个双引号. 如定义好#define STRING( ...
- 16-static和extern关键字2-对变量的作用
上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问:extern用来定义和声明一个外部函数,允许其他文件访问.static和extern对变量也有 ...
- 15-static和extern关键字1-对函数的作用
一.extern与函数 如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.ob ...
- 【转载】C/C++中extern关键字详解
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- C++中extern关键字用法小结
总结C++中关于extern关键字的用法. 1.变量的生明和定义中 C++语言支持分离式编译机制,该机制允许将程序分割为若干个文件,每个文件可被独立编译.为了将程序分为许多文件,则需要在文件中共享代码 ...
- C语言中的 extern 关键字
今天在 BLE 中看到很多 extern 关键字,现在总结一下: extern 关键字主要用于在一个c文件中要用到另一个c文件中的变量或者函数. example: #extern_base.c ; # ...
随机推荐
- OO第三单元作业总结
OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...
- 基于webpack的前端工程化开发解决方案探索(三):webpack-dev-server
前两篇中我们使用webpack完成了静态资源(css/js/img)等自动写入HTML模板中,同时还可以为静态资源添加hash版本号,既满足了我们对于静态资源的打包要求,同时又无需开发人员介入打包过程 ...
- GO执行shell命令
Golang执行shell命令主要依靠exec模块 代码为核心逻辑,并非全部 运行命令 cmd1 = exec.Command("ls") if err = cmd1.Run(); ...
- Jmeter学习笔记(十七)——jmeter目录结构
原文链接:http://www.cnblogs.com/zichuan/p/6938772.html 一.bin目录examples: 目录中有CSV样例 jmeter.bat windows的启 ...
- Swagger Liunx环境搭建(亲测百分百可用)
一.安装nodejs 下载编译好的nodejs安装包,下载地址: https://nodejs.org/dist/v10.10.0/ (作者下载的10.10.0,可根据自己需要下载不同版本) 将下载好 ...
- PHP java时间戳转php时间戳
/** * java时间戳转php时间戳 * @param int $javaUt java的时间戳 * @return int * @Date 2019/8/26 */ public static ...
- java requestmapping中关于路径的问题
需要这种url写的方式才能映射
- 使用focusky制作展示动画
一个协会要举办大会议,以前我帮着做了个图片视频,就是很多照片循环展示,配个背景音乐那种. 现在又找到我,我用focusky制作下,因很久不用,怎么使用也忘了,这个软件的操作逻辑也不太容易搞的清,主要是 ...
- Notepad++常用快捷键:
Ctrl-H 打开Find / Replace 对话框 Ctrl-D 复制当前行 Ctrl-L 删除当前行 Ctrl-T 上下行交换 F3 找下一个 Shift-F3 找上一个 Ctrl-Shift- ...
- HTML&CSS基础-内联框架
HTML&CSS基础-内联框架 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.如下图所示,在同一个路径中有两个网页 <!DOCTYPE html> < ...