使用 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 强制实例化对象的主要内容,如果未能解决你的问题,请参考以下文章

C# 如何根据指定变量来实例化对象?

如何让 GCC 用非平凡的 const/dest 实例化一个类实例?

有没有办法避免警告/错误模板实例化回溯?

可变参数模板错误:“在实例化中”(gcc 9.2)

在另一个标题中强制模板实例化

无法强制实例化专用模板