Расширения PHP и Doxygen
Любимые разработчиками PHP макросы и их уровень вложенности зачастую оказываются плохо совместимыми с системой документирования исходных текстов Doxygen.
В зависимости от настроек препроцессора Doxygen (в частности, директивы SKIP_FUNCTION_MACROS) отдельные блоки кода могут быть вообще пропущены; например, в коде:
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. Далее »
Сен
2009
GCC: освобождение ресурсов для ленивых
Одной из, скажем так, «нетрадиционных» возможностей, которые предоставляет GCC, являются атрибуты типов, переменных и функций.
Я хочу рассказать об одном из них — а именно, отвечающем за удаление использованных ресурсов. Далее »
Автор: Vladimir, опубликовано в: C/C++, комментариев: 2Июн
2009
Распараллеливать или не распараллеливать — вот в чём вопрос
OpenMP — мощная технология, позволяющая значительно повысить быстродействие приложения без переработки его архитектуры. Как и в случае с любой другой мощной технологией, знать, когда нужно её использовать не менее важно, чем уметь с этой технологией работать. В данной статье мы попытаемся показать, что распараллеливание — не панацея от всех бед, и неправильное его использование не только не улучшает производительность приложения, но и может привести к проблемам. Мы постараемся рассмотреть реализацию OpenMP на низком уровне, чтобы оценить потери производительности, связанные с издержками на управление потоками и внутреннюю синхронизацию. В конце статьи будут даны некоторые практические рекомендации по использованию OpenMP. Далее »
Автор: Vladimir, опубликовано в: OpenMP, комментариев: 1Апр
2009
GCC: извращения с вращением
Неоднократно встречаю такие объявления в заголовочных файлах (это особенно характерно для всяких «домашних» криптографических библиотек):
{
#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
}
Так вот: так делать не надо. Далее »
Автор: Vladimir, опубликовано в: C/C++, комментариев: 1Мар
2009
GCC и throw-спецификация у автоматически сгенерированного виртуального деструктора
Имеется кусок кода:
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 for ‘virtual Derived::~Derived()’
test.cpp:6: error: overriding ‘virtual Base::~Base() throw ()’
Самое интересное, что если сделать Derived::s типа, например, int, то ошибка исчезнет.
В чем же дело? Далее »
Автор: Vladimir, опубликовано в: C/C++, Всё подряд, комментариев: нетМай
2008

Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.

