使用gcc强制实例化对象
问题描述:
在以下代码中,gcc未实例化NSP :: Admin和NSP :: Server对象。 它只是跳过它们。使用gcc强制实例化对象
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。
答
它不会实例他们,因为NSP::Admin admin();
不会创建任何对象。
相反,它是一个函数的函数原型声明,它返回NSP :: Admin对象并使用void参数。它是那些奇怪的C++语法之一。第二个工作是因为编译器不会认为它是一个函数原型而感到“困惑”。它可以清楚地看到你正在创建一个对象。
要使用默认的构造函数使用
NSP::Admin admin; // (without parenthesis)
NSP::server server;
创建一个对象
答
尝试:
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;
}