Я работаю над кодом, созданным компанией Ripple, которая предоставляет решения для мультивалютных платежей.
В настоящее время я анализирую код своего демона сервера доступно на Github.
Возможно, я не первый, кто придет к такому выводу, но чрезвычайно трудно не потеряться, работая над чьим-то большим проектом. Хотя документация предоставлена, код все еще не кажется мне понятным, если вы не один из создателей.
Одна из основных трудностей заключается в том, что код ссылается на внешние библиотеки, и иногда кажется невозможным узнать, где искать, чтобы узнать, что делает функция или какое значение содержит переменная.
Простой пример из моего вопроса на данный момент:
Я начинаю с файла main.cpp (потому что я предполагаю, что это то, что запускается при запуске программы), и у меня есть следующие строки:
#if defined(BEAST_LINUX) || defined(BEAST_MAC) || defined(BEAST_BSD)
#include <sys/resource.h>
#endif
Я искал неделю, но не могу найти, что BEAST_LINUX
для.
(Это избыточная проблема, когда очень часто вызываются инструкции макросов и препроцессоров, которые относятся к #define
это относится к #define
и так далее, и документацию редко можно найти в сети).
Кроме того, есть ли быстрый способ узнать, где переменная объявлена в репозитории GitHub, особенно когда она объявлена в другом файле?
#if defined(BEAST_LINUX) || defined(BEAST_MAC) || defined(BEAST_BSD)
#include <sys/resource.h>
#endif
Позвольте мне рассказать вам, как я рассуждал об этом коде:
Во-первых, я вижу, что это будет иногда включать sys/resource.h
и иногда не включать его. <>
говорит мне, что это системный заголовок. Так что это код, чтобы решить, стоит ли включать конкретный системный заголовок.
Во-вторых, я вижу, что тест для макросов, которые отличаются тем, что говорит LINUX
, один MAC
, и один BSD
, Я знаю, что это платформы. И тест это или.
Итак, теперь я могу сделать вывод, что если задано определение, связанное с одной из трех платформ, то мы включаем конкретный системный заголовок.
перфорация sys/resource.h
в мою любимую поисковую систему, я считаю, что это часть Одиночная спецификация UNIX. И я замечаю, что все три платформы, упомянутые в макросе, имеют наследие UNIX.
Итак, в заключение, код, кажется, включает заголовок SUS на тех платформах, которые, как ожидается, будут иметь этот конкретный заголовок. В частности, не на Windows, которая не будет иметь его.
Кстати, я бы предложил клонировать репозиторий git на свой компьютер, чтобы вы могли использовать на нем локальные инструменты поиска. Если вы собираетесь анализировать большой объем кода, стоит создать среду, которая может содержать код, позволяющий компилировать и анализировать его, а затем научиться использовать его инструменты поиска и навигации для быстрого обхода кода.
Я один из разработчиков rippled
, Как уже упоминалось в другом ответе, это макрос, которому присваивается ненулевое значение, когда код компилируется на платформе Linux; если это так, то это заставляет препроцессор включать определенный заголовок.
Это определение изначально находилось в библиотеке с именем Beast. Большие части этой библиотеки были перенесены из Beast в исходный код Ripple, чтобы упростить включение удивительных веб-сокетов Beast и процедур http в Boost.
Если вы работаете под Windows, существует проект Visual Studio, который при загрузке делает обнаружение символов и графиков кодовых вызовов довольно простым с помощью инструментов, встроенных в Visual Studio.
У меня также есть сборка Doxygen, которая производит хорошую документацию классов и комментариев, а также перекрестную ссылку. Я посмотрю о том, как сделать его общедоступным через Интернет.
Это похоже на макрос
#if (defined (_WIN32) || defined (_WIN64))
#define BEAST_WIN32 1
#define BEAST_WINDOWS 1
#elif defined (BEAST_ANDROID)
#undef BEAST_ANDROID
#define BEAST_ANDROID 1
#elif defined (LINUX) || defined (__linux__)
#define BEAST_LINUX 1
определено в этом источнике Beast: удивительная кроссплатформенная библиотека в этом файле PlatformConfig.h. Однако это старый источник, новая библиотека больше не содержит этого определения. Эта новая библиотека находится здесь зверь, также представлен Boost.
Вы можете искать код в определенном хранилище, используя поиск Github, однако он работает только в последних версиях файлов. Чтобы выполнить поиск по всем версиям файлов, вам нужно сделать это из командной строки, как описано здесь GitHub: поиск по старым версиям файлов. Нет быстрого способа поиска определения переменной или макроса, кроме случаев, когда ваша IDE поддерживает переход к определению функциональности.