使用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; 
}