使用gcc强制实例化对象

时间:2009-06-09 13:02:58

标签: c++ gcc

在以下代码中,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。

2 个答案:

答案 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;
}