Принудительное создание объектов с помощью gcc - PullRequest
0 голосов
/ 09 июня 2009

В следующем коде 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 - это пространство имен проекта.

Использование gcc4.2 во FreeBSD, glog, gflags и boost asio.

Ответы [ 2 ]

12 голосов
/ 09 июня 2009

Он не создает их, потому что NSP::Admin admin(); не создает никаких объектов.

Вместо этого это объявление прототипа функции, которая возвращает объект NSP :: Admin и принимает пустые аргументы. Это один из тех странных синтаксисов C ++. Второй работает, потому что компилятор не запутывается, думая, что это прототип функции. Хорошо видно, что вы создаете объект.

Чтобы создать объект с помощью конструктора по умолчанию, используйте

NSP::Admin            admin;   // (without parenthesis)
NSP::server           server;
3 голосов
/ 09 июня 2009

Попробуйте:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...