5代表小指,4代表无名指,3代表中指,2代表食指,1代表大拇指。G是531,D7是521,C是531。 Em531,Am421或321,B和B7记不太清。供您参考
一般月份的缩写是三个字母,June缩写是Jun,July是缩写是Jul,September的缩写是Sep。
为了应对美国大选季期间高发的虚假信息,谷歌母公司 Alphabet 推出了一款名叫 Assembler 的 AI 工具,以帮助人们检验原始照片是否被篡改。
其结合了一系列的测试来排查线索,比如观察照片是否经过了裁切、并粘贴到另一张图片中,亮度、或从背景中删除了某些区域。
【图自:FB,via Cnet】
对于需要慎之又慎的新闻媒体来说,Assembler 或许可以成为一款得力的事实检查工具,比如 Facebook 首席执行官 Mark Zuckerberg,就一直被怀疑有着机器人般的假笑。
Assembler 项目团队由 Alphabet 的许多人员组成,包括工程师、设计师、研究人员、政策专家,致力于解决虚假信息、骚扰、审查制度、暴力极端主义、选举操纵等问题。
随着深度学习和人工智能技术的发展,DeepFake 之类的照片 / 视频伪造工具已经引发了人们的极大关注。在当今充满矛盾的线上环境中,虚假信息很容易在社交网络中散播开来。
为了化解人们的忧虑,行业已经付出了许多努力,包括解释技术的细节、严格审查制度、保护自由权利、以及减少欺诈内容。
【图自:Alphabet】
项目负责人 Jared Cohen 在周二的一篇博客文章中表示:
Assembler 工具已被包括法新社、Animail Politico、Code for Africa、LesDécodeurs du Monde 和 Rappler 等在内的新闻和事实检查机构所采用。
不过目前,普通人暂时无法对上传至 Facebook 的可疑照片展开事实检查。
在用C++的项目源码中,经常会不可避免的会看到下面的代码:
1
#ifdef __cplusplus
2
extern “C“ {
3
#endif
4
5
/*...*/
6
7
#ifdef __cplusplus
8
}
9
#endif
它到底有什么用呢,你知道吗?而且这样的问题经常会出现在面试or笔试中。下面我就从以下几个方面来介绍它:
1、#ifdef _cplusplus/#endif _cplusplus及发散
2、extern “C“
2.1、extern关键字
2.2、“C“
2.3、小结extern “C“
3、C和C++互相调用 4、C和C++混合调用特别之处函数指针
3.1、C++的编译和连接
3.2、C的编译和连接
3.3、C++中调用C的代码
3.4、C中调用C++的代码
1、#ifdef _cplusplus/#endif _cplusplus及发散
在介绍extern “C“之前,我们来看下#ifdef
_cplusplus/#endif
_cplusplus的作用。很明显#ifdef/#endif、#ifndef/#endif用于条件编译,#ifdef
_cplusplus/#endif
_cplusplus——表示如果定义了宏_cplusplus,就执行#ifdef/#endif之间的语句,否则就不执行。
在这里为什么需要#ifdef _cplusplus/#endif
_cplusplus呢?因为C语言中不支持extern “C“声明,如果你明白extern
“C“的作用就知道在C中也没有必要这样做,这就是条件编译的作用!在.c文件中包含了extern “C“时会出现编译时错误。
既然说到了条件编译,我就介绍它的一个重要应用——避免重复包含头文件。还记得腾讯笔试就考过这个题目,给出类似下面的代码(下面是我最近在研究的一个开源web服务器——Mongoose的头文件mongoose.h中的一段代码):
01
#ifndef MONGOOSE_HEADER_INCLUDED
02
#define MONGOOSE_HEADER_INCLUDED
03
04
#ifdef __cplusplus
05
extern “C“ {
06
#endif /* __cplusplus */
07
08
/*.................................
09
* do something here
10
*.................................
11
*/
12
13
#ifdef __cplusplus
14
}
15
#endif /* __cplusplus */
16
17
#endif /* MONGOOSE_HEADER_INCLUDED */
然后叫你说明上面宏#ifndef/#endif的作用?为了解释一个问题,我们先来看两个事实:
这个头文件mongoose.h可能在项目中被多个源文件包含(#include
“mongoose.h“),而对于一个大型项目来说,这些冗余可能导致错误,因为一个头文件包含类定义或inline函数,在一个源文件中mongoose.h可能会被#include两次(如,a.h头文件包含了mongoose.h,而在b.c文件中#include
a.h和mongoose.h)——这就会出错(在同一个源文件中一个结构体、类等被定义了两次)。
从逻辑观点和减少编译时间上,都要求去除这些冗余。然而让程序员去分析和去掉这些冗余,不仅枯燥且不太实际,最重要的是有时候又需要这种冗余来保证各个模块的独立。
为了解决这个问题,上