在以下代码中,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。
答案 0 :(得分:12)
它不会实例化它们,因为NSP::Admin admin();
不会创建任何对象。
相反,它是一个函数的函数原型的声明,它返回NSP :: Admin对象并获取void参数。它是那些奇怪的C ++语法之一。第二个工作原因是,编译器不会“混淆”认为它是一个函数原型。它可以清楚地看到你正在创建一个对象。
要使用默认构造函数创建对象,请使用
NSP::Admin admin; // (without parenthesis)
NSP::server server;
答案 1 :(得分:3)
尝试:
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;
}