使用 gcc 强制实例化对象
Posted
技术标签:
【中文标题】使用 gcc 强制实例化对象【英文标题】:Force instantiation of objects with gcc 【发布时间】:2009-06-09 13:02:58 【问题描述】:在下面的代码中,gcc 没有实例化 NSP::Admin 和 NSP::Server 对象。 它只是跳过它们。
int main(int argc, char **argv)
// Here we bootstrap google logging
// we also install the signal handler
google::InitGoogleLogging(argv[0]);
google::InstallFailureSignalHandler();
// now we parse the arguments with gflags
google::ParseCommandLineFlags(&argc, &argv, true);
NSP::Admin admin();
NSP::server server();
DLOG(INFO) << "boost io_service run";
NSP::ioservice::getIOService().run();
如果我向 CTORS 添加一个参数,它们就会被实例化。 示例:
NSP::Admin admin(1);
NSP::server server(1);
我无法使用 gdb 对它们进行断点,并且单步跳过它们。 这两个对象向 boost io 服务注册自己,并在其 CTORS 中调用一个方法。
NSP 是项目命名空间。
在 FreeBSD 上使用 gcc4.2, glog、gflags 和 boost asio。
【问题讨论】:
【参考方案1】:它不会实例化它们,因为NSP::Admin admin();
不会创建任何对象。
相反,它是一个函数原型的声明,它返回 NSP::Admin 对象并接受 void 参数。它是那些奇怪的 C++ 语法之一。第二个有效,因为编译器不会“混淆”认为它是一个函数原型。它可以清楚地看到您正在创建一个对象。
使用默认构造函数创建对象
NSP::Admin admin; // (without parenthesis)
NSP::server server;
【讨论】:
【参考方案2】:试试:
NSP::Admin admin;
NSP::server server;
示例程序:
#include <iostream>
class Foo
public:
Foo() std::cout << "CTR" << std::endl;
;
int a()
std::cout << "a in" << std::endl;
Foo foo();
std::cout << "a out" << std::endl;
int b()
std::cout << "b in" << std::endl;
Foo foo;
std::cout << "b out" << std::endl;
int main()
a();
b();
return 0;
【讨论】:
以上是关于使用 gcc 强制实例化对象的主要内容,如果未能解决你的问题,请参考以下文章