directory search
Algorithms Algorithms(算法) bsearch bsearch_s qsort qsort_s Atomic operations Atomic operations library(原子操作库) ATOMIC_*_LOCK_FREE atomic_compare_exchange_strong atomic_compare_exchange_strong_explicit atomic_compare_exchange_weak atomic_compare_exchange_weak_explicit atomic_exchange atomic_exchange_explicit atomic_fetch_add atomic_fetch_add_explicit atomic_fetch_and atomic_fetch_and_explicit atomic_fetch_or atomic_fetch_or_explicit atomic_fetch_sub atomic_fetch_sub_explicit atomic_fetch_xor atomic_fetch_xor_explicit atomic_flag atomic_flag_clear atomic_flag_clear_explicit ATOMIC_FLAG_INIT atomic_flag_test_and_set atomic_flag_test_and_set_explicit atomic_init atomic_is_lock_free atomic_load atomic_load_explicit atomic_signal_fence atomic_store atomic_store_explicit atomic_thread_fence(线程围栏) ATOMIC_VAR_INIT kill_dependency memory_order(内存排序) C keywords auto(自动存储) break(跳出循环) C keywords(关键词) case char const(常量修饰符) continue default(预设运算式) do double(双精度浮点型) else enum(枚举类型) extern(全局变量) float(浮点数) for fortran goto(goto语句) if(if语句) inline(行内函式) int long(长整型) register(寄存器变量) restrict( restrict类型限定符) return short signed sizeof(sizeof运算符) static(静态变量) struct(结构体) switch(switch语句) typedef(typedef关键字) union(联合体) unsigned(无符号) void(空类型) volatile(volatile变量) while(while语句) _Alignas _Alignof _Atomic _Bool _Complex _Generic _Imaginary _Noreturn _Static_assert _Thread_local C language #define directive #elif directive #else directive #endif directive #error directive #if directive #ifdef directive #ifndef directive #include directive #line directive #pragma directive alignas(对齐指定符) Alternative operators and tokens(替代运算符和令牌) Analyzability Arithmetic operators Arithmetic types Array declaration(数组声明) Array initialization(阵列初始化) ASCII Chart Assignment operators(赋值运算符) types(atomic类型限定符) Basic concepts Bit fields(位域) break statement C language C Operator Precedence cast operator character constant(字符字面量) Comments(注释符) Comparison operators(比较运算符) compound literals(符合字面量) Conditional inclusion(条件包含) Conformance(一致性) const type qualifier(const 限定符) Constant expressions(常量表达) continue statement Declarations(声明) do-while loop Enumerations(枚举类型) Escape sequences(转义字符) Expressions(表达式) External and tentative definitions(外部和暂定的定义) File scope(文件范围) floating constant(浮点常量) for loop Function declarations(函数声明) Function definitions(函数声明) Functions Generic selection泛型选择 goto statement Identifier(标示符) if statement Implicit conversions(隐式转换) Increment/decrement operators(前置/后置操作符) Initialization(初始化) inline function specifier(内联函式) integer constant Lifetime(生命期) Logical operators(逻辑运算符) Lookup and name spaces Main function(主函式) Member access operators(会员接入运营商) Memory model Objects and alignment(字节对齐) Order of evaluation(评估顺序) Other operators Phases of translation(翻译阶段) Pointer declaration Preprocessor(预处理) restrict type qualifier(restrict类型限定符) return statement Scalar initialization(标量类型初始化) Scope(范围) sizeof operator(sizeof运算符) Statements(陈述) static assert declaration(静态断言声明) Static storage duration(静态存储周期) Storage-class specifiers(存储类说明符) string literals(字符串字面量) Struct and union initialization(结构体与联合体初始化) Struct declaration(结构体声明) switch statement Thread storage duration(线程存储时间) Type Type(类型) Typedef declaration(Typedef声明) Undefined behavior(未定义行为) Union declaration(联合体声明) Value categories(值类别) Variadic arguments(变长参数宏) volatile type qualifier(volatile 类型限定符) while loop _Alignof operator _Noreturn function specifier Date and time asctime(asctime函数) asctime_s clock CLOCKS_PER_SEC clock_t ctime(ctime函数) ctime_s Date and time utilities(日期和时间库) difftime(计算两个时间的间隔) gmtime gmtime_s localtime localtime_s mktime(将时间结构数据转换成经过的秒数的函数) strftime(格式化输出时间函数) time timespec timespec_get time_t tm wcsftime(格式化时间宽字符) Dynamic memory management aligned_alloc C memory management library(内存管理库) calloc free(释放动态分配空间的函数) malloc(动态分配内存空间的函数) realloc(重新分配内存空间的函数) Error handling abort_handler_s assert(断言) constraint_handler_t errno(错误报告) Error handling(错误处理) Error numbers(错误个数) ignore_handler_s set_constraint_handler_s static_assert File input/output clearerr(清除/复位) fclose feof ferror fflush(清空文件缓冲区) fgetc fgetpos fgets fgetwc fgetws File input/output fopen fopen_s fprintf fprintf_s fputc fputs fputwc fputws fread freopen freopen_s fscanf fscanf_s fseek fsetpos ftell fwide fwprintf fwprintf_s fwrite fwscanf fwscanf_s getc getchar gets gets_s getwchar perror printf printf_s putc putchar puts putwc putwchar remove rename rewind scanf scanf_s setbuf setvbuf snprintf sprintf sscanf sscanf_s swprintf swprintf_s swscanf swscanf_s tmpfile tmpfile_s tmpnam tmpnam_s ungetc ungetwc vfprintf vfprintf_s vfscanf vfscanf_s vfwprintf vfwprintf_s vfwscanf vfwscanf_s vprintf vprintf_s vscanf vscanf_s vsnprintf vsprintf vsscanf vsscanf_s vswprintf vswprintf_s vswscanf vswscanf_s vwprintf vwprintf_s vwscanf vwscanf_s wprintf wprintf_s wscanf wscanf_s Localization support lconv LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC LC_TIME localeconv Localization support setlocale Numerics abs acos acosf acosh acoshf acoshl acosl asin asinf asinh asinhf asinhl asinl atan atan2 atan2f atan2l atanf atanh atanhf atanhl atanl cabs cabsf cabsl cacos cacosf cacosh cacoshf cacoshl cacosl carg cargf cargl casin casinf casinh casinhf casinhl casinl catan catanf catanh catanhf catanhl catanl cbrt cbrtf cbrtl ccos ccosf ccosh ccoshf ccoshl ccosl ceil ceilf ceill cexp cexpf cexpl cimag cimagf cimagl clog clogf clogl CMPLX CMPLXF CMPLXL Common mathematical functions complex Complex number arithmetic conj conjf conjl copysign copysignf copysignl cos cosf cosh coshf coshl cosl cpow cpowf cpowl cproj cprojf cprojl creal crealf creall csin csinf csinh csinhf csinhl csinl csqrt csqrtf csqrtl ctan ctanf ctanh ctanhf ctanhl ctanl div double_t erf erfc erfcf erfcl erff erfl exp exp2 exp2f exp2l expf expl expm1 expm1f expm1l fabs fabsf fabsl fdim feclearexcept fegetenv fegetexceptflag fegetround feholdexcept feraiseexcept fesetenv fesetexceptflag fesetround fetestexcept feupdateenv FE_ALL_EXCEPT FE_DFL_ENV FE_DIVBYZERO FE_DOWNWARD FE_INEXACT FE_INVALID FE_OVERFLOW FE_TONEAREST FE_TOWARDZERO FE_UNDERFLOW FE_UPWARD Floating-point environment float_t floor floorf floorl fma fmaf fmal fmax fmaxf fmaxl fmin fminf fminl fmod fmodf fmodl fpclassify FP_INFINITE FP_NAN FP_NORMAL FP_SUBNORMAL FP_ZERO frexp frexpf frexpl HUGE_VAL HUGE_VALF HUGE_VALL hypot hypotf hypotl I ilogb ilogbf ilogbl imaginary imaxabs imaxdiv INFINITY isfinite isgreater isgreaterequal isinf isless islessequal islessgreater isnan isnormal isunordered labs ldexp ldexpf ldexpl ldiv lgamma lgammaf lgammal llabs lldiv llrint llrintf llrintl llround llroundf llroundl log log10 log10f log10l log1p log1pf log1pl log2 log2f log2l logb logbf logbl logf logl lrint lrintf lrintl lround lroundf lroundl MATH_ERREXCEPT math_errhandling MATH_ERRNO modf modff modfl nan NAN nanf nanl nearbyint nearbyintf nearbyintl nextafter nextafterf nextafterl nexttoward nexttowardf nexttowardl Numerics pow powf powl Pseudo-random number generation rand RAND_MAX remainder remainderf remainderl remquo remquof remquol rint rintf rintl round roundf roundl scalbln scalblnf scalblnl scalbn scalbnf scalbnl signbit sin sinf sinh sinhf sinhl sinl sqrt sqrtf sqrtl srand tan tanf tanh tanhf tanhl tanl tgamma tgammaf tgammal trunc truncf truncl Type-generic math _Complex_I _Imaginary_I Program support abort atexit at_quick_exit exit EXIT_FAILURE EXIT_SUCCESS getenv getenv_s jmp_buf longjmp Program support utilities quick_exit raise setjmp SIGABRT SIGFPE SIGILL SIGINT signal SIGSEGV SIGTERM sig_atomic_t SIG_DFL SIG_ERR SIG_IGN system _Exit Strings atof atoi atol atoll btowc c16rtomb c32rtomb char16_t char32_t isalnum isalpha isblank iscntrl isdigit isgraph islower isprint ispunct isspace isupper iswalnum iswalpha iswblank iswcntrl iswctype iswdigit iswgraph iswlower iswprint iswpunct iswspace iswupper iswxdigit isxdigit mblen mbrlen mbrtoc16 mbrtoc32 mbrtowc mbsinit mbsrtowcs mbsrtowcs_s mbstate_t mbstowcs mbstowcs_s mbtowc memchr memcmp memcpy memcpy_s memmove memmove_s memset memset_s Null-terminated byte strings Null-terminated multibyte strings Null-terminated wide strings strcat strcat_s strchr strcmp strcoll strcpy strcpy_s strcspn strerror strerrorlen_s strerror_s Strings library strlen strncat Thread support call_once cnd_broadcast cnd_destroy cnd_init cnd_signal cnd_timedwait cnd_wait mtx_destroy mtx_init mtx_lock mtx_plain mtx_recursive mtx_timed mtx_timedlock mtx_trylock mtx_unlock once_flag ONCE_FLAG_INIT thrd_busy thrd_create thrd_current thrd_detach thrd_equal thrd_error thrd_exit thrd_join thrd_nomem thrd_sleep thrd_success thrd_timedout thrd_yield Thread support library thread_local tss_create tss_delete TSS_DTOR_ITERATIONS tss_get tss_set Type support Boolean type support library Fixed width integer types FLT_EVAL_METHOD FLT_ROUNDS max_align_t NULL Numeric limits offsetof ptrdiff_t size_t Type support Variadic functions Variadic functions va_arg va_copy va_end va_list va_start
characters

指定对象和功能的存储时间链接

  • auto  - 自动持续时间和不连接

  • register - 自动持续时间,不需要链接; 这个变量的地址不能被采用

  • static  - 静态持续时间和内部联系(除非在块范围内)

  • extern  - 静态持续时间和外部联系(除非已经内部声明)

_Thread_local - thread storage duration

(since C11)

  • _Thread_local  - 线程存储时间

(since C11)

说明

存储类说明符出现在声明中。最多可以使用一个说明符,除了_Thread_local可以结合staticextern调整结合(自C11以来)。存储类说明符确定它们声明的名称的两个独立属性:存储持续时间链接

1)auto说明符只允许在块范围声明的对象(函数参数列表除外)。它表示自动存储持续时间并且没有链接,这是这些类型的声明的默认值。

2)register说明符仅适用于在块范围声明的对象,包括函数参数列表。它指示自动存储持续时间并且没有链接(这是这些类型的声明的默认值),但是另外提示优化器在可能的情况下将该变量的值存储在CPU寄存器中。无论这种优化是否发生,声明的变量register都不能用作地址运算符的参数,不能使用alignas(因为C11),并且register数组不能用于指针转换。

3)static说明符同时指定静态存储持续时间(除非与_Thread_localC11组合)和内部链接(除非在块范围使用)。它可以与文件范围内的函数和文件和块范围内的变量一起使用,但不能在函数参数列表中使用。

4)extern说明符指定静态存储持续时间(除非与_Thread_localC11结合)和外部链接。它可以在文件和块范围中使用函数和对象声明(不包括函数参数列表)。如果extern在重新声明已经用内部链接声明的标识符时出现,则链接保持内部。否则(如果先前的声明是外部的,无关联的或不在范围内的话),该联系是外部的。

5)_Thread_local表示线程的存储时间。它不能用于函数声明。如果它用于对象的声明,则它必须出现在同一对象的每个声明中。如果它在块范围声明中使用,则必须将它与静态或外部结合来决定链接。

(自C11以来)

如果未提供存储类说明符,则默认值为:

extern用于块范围内extern对象的文件范围auto对象的所有函数

对于使用存储类说明符声明的任何结构体或联合体,存储持续时间(但不是链接)以递归方式适用于其成员。

块范围的函数声明可以使用,extern或者根本不使用。文件范围的函数声明可以使用externstatic

函数参数不能使用除register。以外的任何存储类说明符。请注意,static在数组类型的函数参数中有特殊含义。

存储时间

每个对象都有一个称为存储时间的属性,这会限制对象的生存期。C中有四种存储持续时间:

  • 自动存储时间。当声明对象的块被输入时,存储器被分配,当通过任何方式(goto,return,end)结束时,存储器被分配。一个例外是VLA; 它们的存储在执行声明时分配,而不是在块入口处分配,并且当声明超出范围时,而不是在块退出时(自C99以来)释放。如果块是递归输入的,则为每个递归级别执行新的分配。所有函数参数和非static块范围对象都具有该存储持续时间以及块范围中使用的复合文字。

    • 静态存储时间。存储持续时间是程序的整个执行过程,存储在对象中的值仅在main函数之前初始化一次。声明的所有对象static以及所有未声明内部或外部链接的对象_Thread_local(自C11开始)具有此存储期限。

线程存储时间。存储持续时间是创建它的线程的整个执行过程,并且在线程启动时存储在该对象中的值将被初始化。每个线程都有自己独特的对象。如果执行访问此对象的表达式的线程不是执行其初始化的线程,则该行为是实现定义的。所有声明为_Thread_local的对象都有这个存储期限。

(自C11以来)

  • 线程存储时间。存储持续时间是创建它的线程的整个执行过程,并且在线程启动时存储在该对象中的值将被初始化。每个线程都有自己独特的对象。如果执行访问此对象的表达式的线程不是执行其初始化的线程,则该行为是实现定义的。所有声明的对象_Thread_local都有这个存储时间。

(since C11)

  • 分配的存储时间。根据请求使用动态内存分配功能分配和解除分配存储空间。

连锁

连锁是指在其他范围内引用标识符(变量或函数)的能力。如果具有相同标识符的变量或函数在多个作用域中声明,但不能从所有作用域中引用,则会生成多个变量实例。以下联系被认可:

  • 没有联系。标识符只能从其所在的范围中引用。所有函数参数和所有非extern块范围变量(包括已声明的变量static)都具有此关联关系。

    • 内部联系。标识符可以从当前翻译单元中的所有范围引用。所有的static标识符(包括函数和变量)都有这种联系。

    • 外部联系。标识符可以从整个程序中的任何其他翻译单元引用。所有非static函数,所有extern变量(除非更早声明static)和所有文件范围非static变量都具有此关联。

如果相同的标识符在同一翻译单元中同时出现内部和外部链接,则行为不确定。当使用临时定义时,这是可能的。

链接和库

具有外部链接的声明通常在头文件中可用,以便#include该文件的所有翻译单元可以引用与别处定义的相同的标识符。

出现在头文件中的任何带有内部链接的声明都会在包含该文件的每个翻译单元中生成一个独立且不同的对象。

库接口:

// flib.h#ifndef FLIB_H
#define FLIB_Hvoid f(void);              // function declaration with external linkageextern int state;          // variable declaration with external linkagestatic const int size = 5; // definition of a read-only variable with internal linkageenum { MAX = 10 };         // constant definitioninline int sum (int a, int b) { return a+b; } // inline function definition#endif // FLIB_H

库实现:

// flib.c#include "flib.h"static void local_f(int s) {}  // definition with internal linkage (only used in this file)static int local_state;        // definition with internal linkage (only used in this file)
 int state;                     // definition with external linkage (used by main.c)void f(void) {local_f(state);} // definition with external linkage (used by main.c)

应用代码:

// main.c #include "flib.h"int main(void){
    int x[MAX] = {size}; // uses the constant and the read-only variable
    state = 7;           // modifies state in flib.c    f();                 // calls f() in flib.c}

关键词

auto, register, static, extern, _Thread_local.

注意

关键字_Thread_local通常通过thread_local标题中定义的便利宏使用threads.h

typedef说明符在C语言语法中正式列为存储类说明符,但用于声明类型名称并且不指定存储。

文件范围中的名称在C中const没有extern外部链接(作为所有文件范围声明的默认链接),但是在C ++中是内部链接。

参考

  • C11 standard (ISO/IEC 9899:2011):

    • 6.2.2 Linkages of identifiers (p: 36-37)

    • 6.2.4 Storage durations of objects (p: 38-39)

    • 6.7.1 Storage-class specifiers (p: 109-110)

  • C99 standard (ISO/IEC 9899:1999):

    • 6.2.2 Linkages of identifiers (p: 30-31)

    • 6.2.4 Storage durations of objects (p: 32)

    • 6.7.1 Storage-class specifiers (p: 98-99)

  • C89/C90 standard (ISO/IEC 9899:1990):

    • 3.1.2.2 Linkages of identifiers

    • 3.1.2.4 Storage durations of objects

    • 3.5.1 Storage-class specifiers

Previous article: Next article: