在静态库(obj 文件)之间共享 class 的实例
Instance of class shared between static libraries (obj files)
我有一个包含以下 3 个文件的 C++ 应用程序:
// sample.h
#ifndef sample_h
#define sample_h
#include <stdio.h>
namespace mynamespace {
class sample {
public:
void myprintf(const char* tmp);
};
}
#endif
// sample.cpp
#include "sample.h"
void mynamespace::sample::myprintf(const char* val) {
printf(val);
}
// main.cpp
#include "sample.h"
int main() {
mynamespace::sample sample1; // How to omit this line?
sample1.myprintf("Hello world!");
}
是否可以从 main.cpp 中删除 sample1 对象的实例化并让它已经可用(来自静态库 "sample.obj")?
如果我将该行移动到 sample.h,那么我在编译期间遇到的错误是:
"class mynamespace::sample sample1" already defined in sample.obj
如果我将该行移至 sample.cpp,则错误消息为:
'sample1': undeclared identifier
其实我明白为什么会出现这两个错误,只是不知道如何解决。
谢谢
Specify an extern
storage class in the header file:
namespace mynamespace {
// ...
extern sample sample1;
}
然后在sample.cpp
中正常定义:
mynamespace::sample sample1;
在某些 compilers/operating 系统上,可能需要指定其他内容,特定于编译器的内容,以便获得与库中数据符号的外部链接。这超出了 C++ 标准的范围。有关详细信息,请参阅编译器的文档。
使用静态声明:
在sample.h
namespace mynamespace{
class sample {
public:
static sample sample1;
void myprintf(const char* tmp);
};
static sample& sample1 = sample::sample1;
}
然后在 sample.cpp
mynamespace::sample mynamespace::sample::sample1;
来自 main.cpp
访问变量
mynamespace::sample::sample1.myprintf("");
mynamespace::sample1.myprintf("");
我有一个包含以下 3 个文件的 C++ 应用程序:
// sample.h
#ifndef sample_h
#define sample_h
#include <stdio.h>
namespace mynamespace {
class sample {
public:
void myprintf(const char* tmp);
};
}
#endif
// sample.cpp
#include "sample.h"
void mynamespace::sample::myprintf(const char* val) {
printf(val);
}
// main.cpp
#include "sample.h"
int main() {
mynamespace::sample sample1; // How to omit this line?
sample1.myprintf("Hello world!");
}
是否可以从 main.cpp 中删除 sample1 对象的实例化并让它已经可用(来自静态库 "sample.obj")?
如果我将该行移动到 sample.h,那么我在编译期间遇到的错误是:
"class mynamespace::sample sample1" already defined in sample.obj
如果我将该行移至 sample.cpp,则错误消息为:
'sample1': undeclared identifier
其实我明白为什么会出现这两个错误,只是不知道如何解决。
谢谢
Specify an extern
storage class in the header file:
namespace mynamespace {
// ...
extern sample sample1;
}
然后在sample.cpp
中正常定义:
mynamespace::sample sample1;
在某些 compilers/operating 系统上,可能需要指定其他内容,特定于编译器的内容,以便获得与库中数据符号的外部链接。这超出了 C++ 标准的范围。有关详细信息,请参阅编译器的文档。
使用静态声明:
在sample.h
namespace mynamespace{
class sample {
public:
static sample sample1;
void myprintf(const char* tmp);
};
static sample& sample1 = sample::sample1;
}
然后在 sample.cpp
mynamespace::sample mynamespace::sample::sample1;
来自 main.cpp 访问变量
mynamespace::sample::sample1.myprintf("");
mynamespace::sample1.myprintf("");