Расширения PHP и Doxygen

Любимые разработчиками макросы и их уровень вложенности зачастую оказываются плохо совместимыми с системой документирования исходных текстов .

В зависимости от настроек препроцессора Doxygen (в частности, директивы SKIP_FUNCTION_MACROS) отдельные блоки кода могут быть вообще пропущены; например, в коде:

[-]
View Code C
PHP_INI_BEGIN()
    STD_PHP_INI_BOOLEAN("chuid.disable_posix_setuid_family", "1",     PHP_INI_SYSTEM, OnUpdateBool,   disable_setuid, zend_chuid_globals, chuid_globals)
    STD_PHP_INI_BOOLEAN("chuid.never_root",                  "1",     PHP_INI_SYSTEM, OnUpdateBool,   never_root,     zend_chuid_globals, chuid_globals)
    STD_PHP_INI_BOOLEAN("chuid.cli_disable",                 "1",     PHP_INI_SYSTEM, OnUpdateBool,   cli_disable,    zend_chuid_globals, chuid_globals)
    STD_PHP_INI_BOOLEAN("chuid.be_secure",                   "1",     PHP_INI_SYSTEM, OnUpdateBool,   be_secure,      zend_chuid_globals, chuid_globals)
    STD_PHP_INI_ENTRY("chuid.default_uid",                   "65534", PHP_INI_SYSTEM, OnUpdateLong,   default_uid,    zend_chuid_globals, chuid_globals)
    STD_PHP_INI_ENTRY("chuid.default_gid",                   "65534", PHP_INI_SYSTEM, OnUpdateLong,   default_gid,    zend_chuid_globals, chuid_globals)
    STD_PHP_INI_ENTRY("chuid.global_chroot",                 NULL,    PHP_INI_SYSTEM, OnUpdateString, global_chroot,  zend_chuid_globals, chuid_globals)
PHP_INI_END()

Блок PHP_INI_BEGIN()PHP_INI_END() может быть рассмотрен как функциональный макрос и проигнорироваться Doxygen. Либо, если директива SKIP_FUNCTION_MACROS установлена в No, распознать декларации PHP_INI_BEGIN() и ZEND_DECLARE_MODULE_GLOBALS() как функции.

У меня не получилось никаким настройками (кроме ручного задания соответствия макросов) заставить Doxygen развернуть макросы из zend_module_entry или всякие PHP_MINIT_FUNCTION. Далее »

Автор: , опубликовано в: C/C++, PHP, комментариев: нет
6
Сен
2009

GCC: освобождение ресурсов для ленивых

Одной из, скажем так, «нетрадиционных» возможностей, которые предоставляет , являются атрибуты типов, переменных и функций.

Я хочу рассказать об одном из них — а именно, отвечающем за удаление использованных ресурсов. Далее »

Автор: , опубликовано в: C/C++, комментариев: 2
2
Июн
2009

Распараллеливать или не распараллеливать — вот в чём вопрос

 — мощная технология, позволяющая значительно повысить быстродействие приложения без переработки его архитектуры. Как и в случае с любой другой мощной технологией, знать, когда нужно её использовать не менее важно, чем уметь с этой технологией работать. В данной статье мы попытаемся показать, что распараллеливание — не панацея от всех бед, и неправильное его использование не только не улучшает производительность приложения, но и может привести к проблемам. Мы постараемся рассмотреть реализацию на низком уровне, чтобы оценить потери производительности, связанные с издержками на управление потоками и внутреннюю синхронизацию. В конце статьи будут даны некоторые практические рекомендации по использованию . Далее »

Автор: , опубликовано в: OpenMP, комментариев: 1
10
Апр
2009

GCC: извращения с вращением

Неоднократно встречаю такие объявления в заголовочных файлах (это особенно характерно для всяких «домашних» криптографических библиотек):

[-]
View Code C
inline uint32_t rol(uint32_t x, uint8_t shift)
{
#if defined(__GNUC__) && defined(__i386__)
    __asm__("roll %%cl,%0" :"=r" (x) :"0" (x),"c" (shift));
    return x;
#else
    return (x < < shift) | (x >> (32 - shift));
#endif
}

Так вот: так делать не надо. Далее »

Автор: , опубликовано в: C/C++, комментариев: 1
22
Мар
2009

GCC и throw-спецификация у автоматически сгенерированного виртуального деструктора

Имеется кусок кода:

[-]
View Code C++
#include <string>

class Base {
public:
    Base(void) {}
    virtual ~Base(void) throw() {}
};

class Derived : public Base {
public:
    ::std::string s;
};

int main(int, char**)
{
    return 0;
}
</string></pre>

При компиляции в GCC выдает интересную ошибку:
<pre lang="bash">
g++ test.cpp
test.cpp:9: error: looser throw specifier forvirtual Derived::~Derived()
test.cpp:6: error:   overriding ‘virtual Base::~Base() throw ()

Самое интересное, что если сделать Derived::s типа, например, int, то ошибка исчезнет.

В чем же дело? Далее »

Автор: , опубликовано в: C/C++, Всё подряд, комментариев: нет
22
Май
2008