qq网名网站源码分享,qq网名起名网

大家好,关于qq网名网站源码分享很多朋友都还不太明白,今天小编就来为大家分享关于qq网名起名网的知识,希望对各位有所帮助!

在你的C语言代码中,不知能否看到类似下面的代码:

这好像没有什么问题,你应该还会想:“嗯?是啊,我们的代码都是这样写的,从来没有因此碰到过什么麻烦啊~”。

你说的没错,如果你的头文件从来没有被任何C++程序引用过的话。

这与C++有什么关系呢?看看__cplusplus(注意前面是两个下划线)的名字你就应该知道它与C++有很大关系。__cplusplus是一个C++规范规定的预定义宏。你可以信任的是:所有的现代C++编译器都预先定义了它;而所有C语言编译器则不会。另外,按照规范__cplusplus的值应该等于199711L,然而不是所有的编译器都照此实现,比如g++编译器就将它的值定义为1。

所以,如果上述代码被C语言程序引用的话,它的内容就等价于下列代码。

在这种情况下,既然extern&34;{}经过预处理之后根本就不存在,那么它和34;C&34;languagestring&34;languagestring&34;C&34;C++&34;C&34;C&34;C&include指令放置在extern&34;{…}里面?

我们先来看一个例子,现有a.h,b.h,c.h以及foo.cpp,其中foo.cpp包含c.h,c.h包含b.h,b.h包含a.h,如下:

现使用C++编译器的预处理选项来编译foo.cpp,得到下面的结果:

正如你看到的,当你把34;C&34;C&34;C&include指令放置在extern&34;{}的外面来避免嵌套。拿之前的例子来说,如果我们把各个头文件的34;C&include指令放置在extern&34;{}里面的另外一个重大风险是,你可能会无意中改变一个函数声明的链接规范。比如:有两个头文件a.h,b.h,其中b.h包含a.h,如下:

按照a.h作者的本意,函数foo是一个C++自由函数,其链接规范为&34;。但在b.h中,由于34;a.h&34;C&include指令后面都隐藏这一个未知的世界,除非你刻意去探索,否则你永远都不知道,当你把一条条34;C&include指令都不能放在extern&34;里面吗?

A:正像这个世界的大多数规则一样,总会存在特殊情况。

有时候,你可能利用头文件机制“巧妙”的解决一些问题。比如,34;C&34;C&34;C&34;C&34;C&34;C&34;C&34;C&34;C&34;C&if__cplusplus…ifdef__cplusplus?if__cplusplus…if__cplusplus…ifdef__cplusplus…39;tRepeatYourself)原则,你总要为之付出额外的代价。解决它的一个简单方案是,定义一个特定的头文件——比如clinkage.h,在其中增加这样的定义:

以下举例中c的函数声明和定义分别在cfun.h和cfun.c中,函数打印字符串“thisiscfuncall”,c++函数声明和定义分别在cppfun.h和cppfun.cpp中,函数打印字符串&34;,编译环境vc2010.

C++调用C的方法

c++调用c的方法,关键是要让c的函数按照c的方式编译,而不是c++的方式。

(1)cfun.h如下:

cppfun.cpp如下:

?

(2)cfun.h同上

cppfun.cpp如下:

(3)cfun.h如下:

cppfun.cpp如下:

C调用C++的方法

c调用c++,关键是C++提供一个符合C调用惯例的函数。

在vs2010上测试时,没有声明什么extern等,只在在cfun.c中包含cppfun.h,然后调用cppfun()也可以编译运行,在gcc下就编译出错,按照c++/c的标准这种做法应该是错误的。以下方法两种编译器都可以运行。

cppfun.h如下:

cfun.c如下:

原文链接:https://mp.weixin.qq.com/s/K2LOo9J0zTdrOuaNOJWHJA

转载自:STM32嵌入式开发

原文链接:C语言中的extern&34;

本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

文章分享结束,qq网名网站源码分享和qq网名起名网的答案你都知道了吗?欢迎再次光临本站哦!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平