inline的C99标准相关原文
WG14/N1256 Annex J (informative) Portability issues
J.1 Unspecified behavior
Whether a call to an inline function uses the inline definition
or the external definition
of the function (6.7.4).
J.2 Undefined behavior
A function with external linkage
is declared with an inline function specifier, but is not also defined in the same translation unit (6.7.4).
J.3 Implementation-defined behavior - J.3.8 Hints
The extent to which suggestions made by using the inline function specifier are effective (6.7.4).
WG14/N1256 6.7.4 Function specifiers
Syntax
function-specifier:
inline
Constraints
Function specifiers shall be used only in the declaration of an identifier for a function.
An inline definition
of a function with external linkage
shall not contain a definition of a modifiable object with static storage duration, and shall not contain a reference to an identifier with internal linkage
.
In a hosted environment, the inline function specifier shall not appear in a declaration of main.
Semantics
A function declared with an inline function specifier is an inline function. The function specifier may appear more than once; the behavior is the same as if it appeared only once. Making a function an inline function suggests that calls to the function be as fast as possible.120) The extent to which such suggestions are effective is implementation-defined.121)
Any function with internal linkage
can be an inline function. For a function with external linkage
, the following restrictions apply: If a function is declared with an inline function specifier, then it shall also be defined in the same translation unit. If all of the file scope declarations for a function in a translation unit include the inline function specifier without extern, then the definition in that translation unit is an inline definition
. An inline definition
does not provide an external definition
for the function, and does not forbid an external definition
in another translation unit. An inline definition
provides an alternative to an external definition
, which a translator may use to implement any call to the function in the same translation unit. It is unspecified whether a call to the function uses the inline definition
or the external definition
.122)
EXAMPLE
The declaration of an inline function with external linkage
can result in either an external definition
, or a definition available for use only within the translation unit. A file scope declaration with extern creates an external definition
. The following example shows an entire translation unit.
inline double fahr(double t)
{
return (9.0 * t) / 5.0 + 32.0;
}
inline double cels(double t)
{
return (5.0 * (t - 32.0)) / 9.0;
}
extern double fahr(double); // creates an `external definition`
double convert(int is_fahr, double temp)
{
/* A translator may perform inline substitutions */
return is_fahr ? cels(temp) : fahr(temp);
}
Note that the definition of fahr is an external definition
because fahr is also declared with extern, but the definition of cels is an inline definition
. Because cels has external linkage
and is referenced, an external definition
has to appear in another translation unit (see 6.9); the inline definition
and the external definition
are distinct and either may be used for the call.
Forward references: function definitions (6.9.1).
- By using, for example, an alternative to the usual function call mechanism, such as ‘‘inline substitution’’. Inline substitution is not textual substitution, nor does it create a new function. Therefore, for example, the expansion of a macro used within the body of the function uses the definition it had at the point the function body appears, and not where the function is called; and identifiers refer to the declarations in scope where the body occurs. Likewise, the function has a single address, regardless of the number of
inline definitions
that occur in addition to theexternal definition
. - For example, an implementation might never perform inline substitution, or might only perform inline substitutions to calls in the scope of an inline declaration.
- Since an
inline definition
is distinct from the correspondingexternal definition
and from any other correspondinginline definitions
in other translation units, all corresponding objects with static storage duration are also distinct in each of the definitions.
6.9 External definitions
Syntax
translation-unit:
external-declaration
translation-unit external-declaration
external-declaration:
function-definition
declaration
Constraints
The storage-class specifiers auto and register shall not appear in the declaration specifiers in an external declaration.
There shall be no more than one external definition
for each identifier declared with internal linkage
in a translation unit. Moreover, if an identifier declared with internal linkage
is used in an expression (other than as a part of the operand of a sizeof operator whose result is an integer constant), there shall be exactly one external definition
for the identifier in the translation unit.
Semantics
As discussed in 5.1.1.1, the unit of program text after preprocessing is a translation unit, which consists of a sequence of external declarations. These are described as ‘‘external’’ because they appear outside any function (and hence have file scope). As discussed in 6.7, a declaration that also causes storage to be reserved for an object or a function named by the identifier is a definition.
An external definition
is an external declaration that is also a definition of a function (other than an inline definition
) or an object. If an identifier declared with external linkage
is used in an expression (other than as part of the operand of a sizeof operator whose result is an integer constant), somewhere in the entire program there shall be exactly one external definition
for the identifier; otherwise, there shall be no more than one.140)
- Thus, if an identifier declared with
external linkage
is not used in an expression, there need be noexternal definition
for it.
其他function specifiers
J.5 Common extensions
The following extensions are widely used in many systems, but are not portable to all implementations. The inclusion of any extension that may cause a strictly conforming program to become invalid renders an implementation nonconforming. Examples of such extensions are new keywords, extra library functions declared in standard headers, or predefined macros with names that do not begin with an underscore.
J.5.9 The fortran keyword
The fortran function specifier may be used in a function declaration to indicate that calls suitable for FORTRAN should be generated, or that a different representation for the external name is to be generated (6.7.4).
还有C11的 _Noreturn
inline的C99标准相关原文的更多相关文章
- C89 和 C99 标准比较
注1: GCC支持C99, 通过 --std=c99 命令行参数开启,如: 代码:gcc --std=c99 test.c 注2:FFMPEG使用的是C99.而VC支持的是C89(不支持C99) ...
- C89标准和C99标准C11标准的区别
转载 C89标准和C99标准C11标准的区别 C99对C89的改变 1.增加restrict指针 C99中增加了公适用于指针的restrict类型修饰符,它是初始访问指针所指对象的惟一途径,因此只有借 ...
- C语言(C99标准)在结构体的初始化上与C++的区别
C++中由于有构造函数的概念,所以很多时候初始化工作能够很方便地进行,而且由于C++标准库中有很多实用类(往往是类模板),现代C++能十分容易地编写. 比如现在要构造一个类Object,包含两个字段, ...
- C99标准新特性的说明
C99标准新特性的说明 一.说明 ====== 这里的讨论的是C语言的国际标准,即国际标准化组织ISO,制定的C语言标准.历史上ISO制定过4个版本的C语言标准,他们分别是:C90(ISO/IEC ...
- Visual Studio2013的C语言编译器对C99标准的支持情况
Visual Studio2013终于开始比较良好地支持C99特性了.在此之前,如果用C语言写代码的话,变量名都需要放到函数体的前面部分,代码写起来十分别扭. 而Visual Studio2013中的 ...
- C99标准的柔性数组 (Flexible Array)
[什么是柔性数组(Fliexible Array)] 柔性数组在C99中的定义是: 6.7.2.1 Structure and union specifiers As a special case, ...
- c99标准的restrict关键字
参考自restrict restrict解释 restrict关键字出现于C99标准,wiki上的解释restrict from wiki. In the C programming language ...
- codeblocks按c99标准编译c文件的设置
作者:朱金灿 来源:http://blog.csdn.net/clever101 早上用codeblocks编译一个c文件,出现这样一个编译错误: +'for'+loop+initial+declar ...
- 给codeblocks的c编译选项添加c99标准
在codeblocks的settings中选择 compiler and debugger,选择compile setting 在其中有other options,在里面写上-std=c99 这样就可 ...
随机推荐
- Struts2配置文件复用代码【web.xml、struts.xml、常量配置】
web.xml的分发器代码: <!-- 引入struts核心过滤器 --> <filter> <filter-name>struts2</filter-nam ...
- java基础知识2--String,StringBufffer,StringBuilder的区别
String,StringBufffer,StringBuilder的区别 1.可变不可变方面 String类中使用字符数组保存字符串 ,final 修饰当然是不可变的,用String来操作字符串的 ...
- 在 Ubuntu 上安装 MongoDB
在 Ubuntu 上安装 MongoDB 运行下列命令,导入 MongoDB 公开 GPG 键: sudo apt-key adv --keyserver hkp://keyserver.ubuntu ...
- openGPS.cn - 高精度IP定位原理,定位误差说明
[ip定位历史] 关于IP定位,最早是通过运营商实现,每个运营商申请到的ip段,在某个范围内使用. 因此早期只能是国家为单位的基础数据. 对于比较大的国家,就进一步划分,比如,中国某通讯公司(不打广告 ...
- linux文件权限解析(摘)
用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念 - 所有者 - 所在组 - 其它组 - 改变用户所在的组 所有者 一般为文件的创建 ...
- 深入理解计算机系统chapter9
从概念上来讲:虚拟存储器被组织为一个存放在磁盘上的N个连续的字节大小的单元组成的数组. 磁盘上数组的内容被缓存到主存中 1. 读写内存的安全性 物理内存本身是不限制访问的,任何地址都可以读写,而操作系 ...
- 转自知乎(JAVA后台开发可以纯粹用JAVA SE吗?)
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:巴多崽链接:http://www.zhihu.com/question/29663744/answer/45154839来源: ...
- 如何在linux下检测内存泄漏
之前的文章应用 Valgrind 发现 Linux 程序的内存问题中介绍了利用Linux系统工具valgrind检测内存泄露的简单用法,本文实现了一个检测内存泄露的工具,包括了原理说明以及实现细节. ...
- zoj1109 水题(大神绕道) Language of FatMouse
Language of FatMouse Time Limit: 10 Seconds Memory Limit:32768 KB We all know that FatMouse doe ...
- Pyhton编程(一)之第一个Pyhton程序
一:Python的第一个程序 Python在Windows系统和Linux系统下都可以安装,这里不过多说明安装过程,linux系统默认情况已经安装了Python2x的版本.注:目前使用的Python均 ...