繁体   English   中英

这三个语句有什么区别?

[英]What is the difference between these three statements?

这三个语句有什么区别?

  1. static const int foo = 42;

  2. const int foo = 42;

  3. #define foo 42

2) const int foo = 42;

这是一个int变量,您不能更改其值。

1) static const int foo = 42;

这与2)相同,但是仅在其所在的源代码文件中可见。因此,例如,如果单独编译它们然后链接在一起,则不能在另一个.cpp文件中使用它。 通过对变量和函数使用静态变量,可以使编译器更好地优化它们,因为编译器可以依靠它知道使用该变量或函数的所有情况。 静态一词在不同情况下的含义不同,但是如果在全局级别使用它,这就是它的行为。 如果在函数内部使用此函数,则它具有不同的含义。 这意味着该变量仅初始化一次,并且无论代码执行通过该定义多少次,它都将保留在内存中。 如果您不同时使用const,则具有更多含义,因为这样您就可以更改变量的值,即使您退出可见该变量的代码部分(称为“范围”),然后重新输入。

3) #define foo 42

这是一个预编译器宏。 因此,在将代码提供给实际编译器之前,预编译器将用数字42替换所有“ foo”。 几年前人们使用这种方法是因为它比const变量要快,但如今它们同样快。

static const int foo = 42;

它的作用取决于在哪里找到以及您使用的语言:

  • 如果这是在命名空间范围(在C ++中)或文件范围(在C中)的声明,则它声明并定义一个具有内部链接的名为foo的const限定对象(这意味着名称foo仅在当前翻译单位,而不是其他翻译单位)。

  • 如果这是在函数范围内的声明(在C或C ++中),则它将声明并定义一个名为foo的const限定对象,该对象没有链接(本地声明的变量没有链接),并且该对象的生存期为持续时间程序的名称(这意味着在对函数的每次调用中, foo指向同一对象)。

  • 如果这是C ++并且是类内部的声明,则它将声明但未定义具有外部链接的名称为foo具有const限制的静态数据成员(这意味着名称foo (在这种情况下,当使用类名)在任何翻译单元中使用时均指相同的对象)。


const int foo = 42;

它的作用取决于您使用的语言以及声明的显示位置。 如果声明在名称空间或文件范围内,则

  • 在C ++中,它声明并定义了一个具有内部链接的名为foo的const限定对象( const表示C ++中的内部链接)。

  • 在C中,这声明并定义了具有外部链接的名为foo的const限定对象( const在C中并不表示内部链接)。

在C ++和C中,如果此声明在函数范围内,则此声明并定义一个没有链接的const限定的本地变量foo


#define foo 42

这没有定义对象。 它定义了一个名为foo的宏,该宏被由单个令牌42组成的令牌序列所取代。

const修饰符用于指定foo是一个常量。 即,初始化后,其值可能不会更改。

static关键字用于告诉编译器,即使超出范围,也应保留要声明为static的变量的值。 这意味着,如果您在函数内部声明一个静态变量,则即使该函数返回后,该变量的值也会被记住(与自动变量不同)。 它还用于告诉编译器变量仅在当前编译单元中可见。 这意味着,如果您声明了一个顶级变量/函数static,则在与此文件一起编译的其他文件中看不到该变量/函数。

#define是一个预处理程序指令,该指令实际编译发生之前对所有出现的foo (在这种情况下)执行文本替换。 编译器甚至看不到foo 它只看到42

前两个声明了一个名为foo的变量,而第三个没有声明任何变量,它只是42的别名。

在C语言中,第一个是文件处理变量,而第二个具有外部链接,这意味着可以从另一个翻译单元中引用它!

但是在C ++中,(第一个和第二个)都是相同的,因为在C ++中const默认是static的。 两者都有内部联系!

static const int foo = 42;

常量静态变量。 只要变量存在,就无法更改一旦初始化的值。 作为静态变量,即使包含声明变量的文件也不能将其包含在任何文件中。 如果这是类的成员,则该类的所有实例仅存在该变量的一个副本。

const int foo = 42;

一个常量变量,其值一旦初始化就保持不变并且不能更改。

#define foo 42

不是变量,而是符号常量。 因此不允许使用&foo类的操作。 foo仅用作42的别名。与其他别名不同,它由preprocessor处理。

static是什么意思? 提示:fgbentr fcrpvsvre

const是什么意思? 提示:ernq-bayl inevnoyr

#define什么作用? 它在编译的哪个阶段进行? 这对于生成的代码意味着什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM