c ++中的extern const

时间:2012-03-12 02:43:38

标签: c++

我有一个名为abc.h的头文件,其中我想用外部链接定义一个常量。因此它包含声明

--------------- abc.h -------------------------

extern const int ONE = 1;

接下来,我有main.cpp,我想使用ONE的值。因此,在将它用作

之前,我在main.cpp中声明了ONE

--------------- --------------------- main.cpp中

extern const int ONE;
int main()
{
     cout << ONE << endl;
}

我收到错误“ONE的多个定义”。

我的问题是,我如何用外部链接声明一个const,然后在不同的文件中使用它,这样常量只有一个内存位置,而不是每个包含常量静态版本的文件。 / p>


我从main.cpp中删除了#include“abc.h”,一切正常。

g ++ abc.h main.cpp -o main

ONE的地址在标题和主要内容中相同。所以它有效。

但我不明白编译器如何在main.cpp中使用include语句解析ONE的定义

似乎g ++做了一些魔术。这是一个不好的做法,main.cpp的读者不知道ONE声明在哪里,因为main.cpp中没有包含“abc.h”?

2 个答案:

答案 0 :(得分:9)

<强> abc.h:

extern const int ONE;

<强> abc.cpp:

#include "abc.h"

const int ONE = 1;

<强> main.cpp中:

#include "abc.h"

int main() {
     cout << ONE << endl;
}

答案 1 :(得分:1)

命令行

  

g ++ abc.h main.cpp -o main

使编译器将头文件 abc.h 用作另一个模块。

通常一种用法是 #include“ abc.h” 并使用:

  

g ++ main.cpp -o main


public class MainActivity extends AppCompatActivity implements BookService.BookCallback {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main)
        new BookService(this).getBooks("android");
    }
}

是一个定义,因此它只能出现在一个模块中。 在标头中,我们放置了声明(不分配实际值):

extern const int ONE = 1;

它们可以多次包含在模块中。 当包含这样的声明时,您的定义可以省略“ extern”:

extern const int ONE;

(这个问题已经7岁了,所以作者已经肯定知道了,但是我想为其他人澄清一下。)