r7 - 10 Mar 2005 - 18:47:59 - Artem PervinYou are here: TWiki >  OPENTS Web > ЧаВО > Non-POD

Такая программа на Т++:

#include <cstdio>

tfun int main()
{
    tval int someval = 10;

    printf("someval: %d\n", someval);

    return 0;
}

вызывает предупреждение на этапе компиляции:


versus@skif:~/work/t++_tests/faq/pod>t++ pod.tcc 
T++->(C++,TSS) Converter v3.0, 2003-2004, PSI RAS, Russia.

  tfun int main:
  tval someval;
: 1 tfunction
pod.tcc: In member function `virtual ts::TFrz tfunmainTFunImpl::body()':
pod.tcc:7: warning: cannot pass objects of non-POD type `class ts::TVar' 
   through `...'; call will abort at runtime

Это предупреждение не имеет отношения к OpenTS. Это предупреждение связано с особенностями передачи объектов, имеющих деструктор в функцию, принимающую произвольное количество аргуметов (.../va_list).

Следующая программа на С++ вызывает аналогичное предупреждение:


#include <cstdio>

class myclass
{
public:
    ~myclass() {}
};

int main()
{
    myclass c;

    printf("myclass: %d\n", c); // например %d. укажите любой другой, в этом примере это не принципиально.

    return 0;
}


versus@skif:~/work/t++_tests/faq/pod>g++ pod.cpp
pod.cpp: In function `int main()':
pod.cpp:13: warning: cannot pass objects of non-POD type `class myclass' 
   through `...'; call will abort at runtime

Для решения этой проблемы предлагается использовать либо явное приведение типа перед передачей ее в функцию типа printf:


#include <cstdio>

tfun int main()
{
    tval int someval = 10;

    printf("someval: %d\n", (int)someval);

    return 0;
}

либо использовать потоковую модель ввода/вывода стандартной библиотеки С++:


#include <iostream>

tfun int main()
{
    tval int someval = 10;

    std::cout << "someval: " << someval << std::endl;

    return 0;
}

Оба способа делают т-величину готовой.

А кто-нибудь знает что суть POD? Я не смог в гугле найти расшифровку frown


POD = Plain Old Data

http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html

Кстати, примечательно что по запросу "non POD" в яндексе первая ссылка указывает именно на наш twiki и именно на этот раздел smile

Versus, давай будем ставить свою подпись после своих высказываний как это рекомендуют создатели twiki. А то как то странно когда под написанными тобой текстами стоит мое имя :-)

-- PhilK - 10 Mar 2005


Нашел неплохую дискуссию о передаче non-POD объектов функции с vararg переменными: http://lists.gnu.org/archive/html/help-gplusplus/2004-10/msg00045.html

Varargs has no clue about how to deal with non-POD types
(mostly because it doesn't know about the special construction/copy/destruction sematics inherit in passing
them to subroutines).

-- Artem Pervin - 10 Mar 2005

Edit | WYSIWYG | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r7 < r6 < r5 < r4 < r3 | More topic actions
 
Powered by TWiki

This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback