我有一个名为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”?
答案 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岁了,所以作者已经肯定知道了,但是我想为其他人澄清一下。)