非常教程

C参考手册

C 语法

External and tentative definitions

在翻译单元的顶层(即预处理程序之后包含所有#includes 的源文件),每个 C 程序都是一系列声明,声明具有外部链接的函数和对象。这些声明被称为外部声明,因为它们出现在任何函数之外。

extern int n; // external declaration with external linkage
int b = 1;    // external definition with external linkage
static const char *c = "abc"; // external definition with internal linkage
int f(void) {  // external definition with external linkage
    int a = 1; // non-external
    return b; 
}
static void x(void) { // external definition with internal linkage
}

使用外部声明声明的对象具有静态存储持续时间,因此不能使用autoregister指定符。由外部声明引入的标识符具有文件范围。

暂定义

暂定定义为外部声明没有初始化,并且或者没有存储类说明或与说明符static

一个初步的定义是,可能会或可能不会作为一个定义的声明。如果在同一翻译单元中早或晚时发现实际的外部定义,那么暂定义只是作为声明。

int i1 = 1;     // definition, external linkage
int i1;         // tentative definition, acts as declaration because i1 is defined
extern int i1;  // declaration, refers to the earlier definition
 
extern int i2 = 3; // definition, external linkage
int i2;            // tentative definition, acts as declaration because i2 is defined
extern int i2;     // declaration, refers to the external linkage definition

如果在同一翻译单元中没有定义,那么暂定义定义就像初始化程序= 0(或者对于数组类型= {0})的实际定义一样。

int i3;        // tentative definition, external linkage
int i3;        // tentative definition, external linkage
extern int i3; // declaration, external linkage
// in this translation unit, i3 is defined as if by "int i3 = 0;"

与 extern 声明不同,如果前一个声明确定了标识符的链接,那么暂定义可能与另一个同一标识符声明不相关。如果同一个标识符的两个声明在范围内并且具有不同的链接,则行为是未定义的:

static int i4 = 2; // definition, internal linkage
int i4;            // Undefined behavior: linkage disagreement with previous line
extern int i4;     // declaration, refers to the internal linkage definition
 
static int i5; // tentative definition, internal linkage
int i5;        // Undefined behavior: linkage disagreement with previous line
extern int i5; // refers to previous, whose linkage is internal

内部联系的初步定义必须具有完整的类型。

static int i[]; // Error, incomplete type in a static tentative definition
int i[]; // OK, equivalent to int i[1] = {0}; unless redeclared later in this file

一个定义规则

每个翻译单元可以具有内部连接(static全局)的每个标识符的零或一个外部定义。

如果在非 VLA(自C99以来),sizeof 或 alignof(自C11以来)以外的任何表达式中使用具有内部链接的标识符,则翻译单元中该标识符必须有且仅有一个外部定义。

整个程序可能具有零或一个外部定义,每个标识符(除了内联函数外)(自C99以来)都带有外部链接。

如果除了非 VLA(自C99以来),sizeof 或 alignof(自C11以来)之外的任何表达式中使用带有外部链接的标识符,则整个程序中某处必须有唯一的外部定义。

笔记

有关内联函数定义的详细信息,请参阅内联。

extern使用文件范围声明查看关键字含义的存储持续时间和链接。

请参阅声明和定义之间区别的定义。

为了标准化各种 C89之前的方法,我们发明了暂时的定义,以通过内部链接转发声明标识符。

参考

  • C11 standard (ISO/IEC 9899:2011):
    • 6.9 External definitions (p: 155-159)
  • C99 standard (ISO/IEC 9899:1999):
    • 6.9 External definitions (p: 140-144)
  • C89/C90 standard (ISO/IEC 9899:1990):
    • 3.7 EXTERNAL DEFINITIONS

C 语法相关

1.#define directive
2.#elif directive
3.#else directive
4.#endif directive
5.#error directive
6.#if directive
7.#ifdef directive
8.#ifndef directive
9.#include directive
10.#line directive
11.#pragma directive
12.alignas
13.Alternative operators and tokens
14.Analyzability
15.Arithmetic operators
16.Arithmetic types
17.Array declaration
18.Array initialization
19.ASCII Chart
20.Assignment operators
21. types
22.Basic concepts
23.Bit fields
24.break statement
25.C language
26.C Operator Precedence
27.cast operator
28.character constant
29.Comments
30.Comparison operators
31.compound literals
32.Conditional inclusion
33.Conformance
34.const type qualifier
35.Constant expressions
36.continue statement
37.Declarations
38.do-while loop
39.Enumerations
40.Escape sequences
41.Expressions
42.File scope
43.floating constant
44.for loop
45.Function declarations
46.Function definitions
47.Functions
48.Generic selection
49.goto statement
50.Identifier
51.if statement
52.Implicit conversions
53.Increment/decrement operators
54.Initialization
55.inline function specifier
56.integer constant
57.Lifetime
58.Logical operators
59.Lookup and name spaces
60.Main function
61.Member access operators
62.Memory model
63.Objects and alignment
64.Order of evaluation
65.Other operators
66.Phases of translation
67.Pointer declaration
68.Preprocessor
69.restrict type qualifier
70.return statement
71.Scalar initialization
72.Scope
73.sizeof operator
74.Statements
75.static assert declaration
76.Static storage duration
77.Storage-class specifiers
78.string literals
79.Struct and union initialization
80.Struct declaration
81.switch statement
82.Thread storage duration
83.Type
84.Type
85.Typedef declaration
86.Undefined behavior
87.Union declaration
88.Value categories
89.Variadic arguments
90.volatile type qualifier
91.while loop
92._Alignof operator
93._Noreturn function specifier
C

C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。