And*_*NER 7 c const language-implementation keyword
我被告知如果我在ANSI-C中编码以按照将要使用的变量的顺序声明,断言指针不是null并且索引在边界内,并且在使用变量之前初始化.
如果我声明一个const,我可以在一个断言和代码块之后初始化它吗?在Java中,最终初始化必须在声明时进行,但是通过ANSI-C实现它是否一致,我可以初始化const一次但不一定在声明时?
Java编译器具有少量流逻辑,允许您final在声明后声明变量.这是合法的Java:
final int something;
if ( today == Friday )
something = 7;
else
something = 42;
Run Code Online (Sandbox Code Playgroud)
Java将检测是否有任何分支未定义最终值.它不会分析条件,所以这不是合法的Java,即使它在逻辑上相似:
final int something;
if ( today == Friday )
something = 7;
if ( today != Friday )
something = 42;
Run Code Online (Sandbox Code Playgroud)
在ANSI C89中,必须在声明它们的语句中初始化const变量(除了extern).
const int something = ( today == Friday ) ? 7 : 42;
Run Code Online (Sandbox Code Playgroud)
extern声明上的修饰符告诉编译器变量是在不同的编译单元(或此编译单元中的其他位置)初始化的.
在ANSI C99中,您可以混合声明和代码,因此您可以const在断言和代码块之后声明和初始化变量.1999 ANSI C的可移植性仍然是一个问题.
解决C89的问题是注意代码之前的声明规则在块范围而不是函数范围内工作,因此您可以这样做:
#include<stdio.h>
int main ( void )
{
printf ( "wibble\n" );
{
const int x = 10;
printf ( "x = %d\n", x );
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)