Ответы пользователя по тегу C++
  • Имеется ли в C++ данный синтаксис?

    @rPman
    Смотрим исходники (как же там неудобно искать, проще было склонировать и найти в файлах)

    Видим что этот дефайн ожидает первым аргументом X часть имени определяемых им переменными и функциями, а вторым, аргументы перед ними, т.е. в твоем примере это static (для макросов нет никакой разницы что в аргументах, лишь бы разбиралось на лексемы даже на скобки кстати пофиг)

    Описание аргументов ,... это variadic т.е. можно несколько аргументов писать в вызове макроса, они все передадутся как есть (есть разные способы их развертывания)

    Вот к примеру твой пример развернется в
    static vnet_feature_arc_registration_t vnet_feat_arc_ip4_unicast;
    static void __vnet_add_feature_arc_registration_ip4_unicast (void)
      __attribute__((__constructor__)) ;
    static void __vnet_add_feature_arc_registration_ip4_unicast (void)
    {
      vnet_feature_main_t * fm = &feature_main;
      vnet_feat_arc_ip4_unicast.next = fm->next_arc;
      fm->next_arc = & vnet_feat_arc_ip4_unicast;
    }
    static void __vnet_rm_feature_arc_registration_ip4_unicast (void)
      __attribute__((__destructor__)) ;
    static void __vnet_rm_feature_arc_registration_ip4_unicast (void)
    {
      vnet_feature_main_t * fm = &feature_main;
      vnet_feature_arc_registration_t *r = &vnet_feat_arc_ip4_unicast;
      VLIB_REMOVE_FROM_LINKED_LIST (fm->next_arc, r, next);
    }
    static vnet_feature_arc_registration_t vnet_feat_arc_ip4_unicast

    Заметь что последняя строчка не завершена, нет ";", значит если после вызова этого макроса поставить = ... то пойдет определение значения переменной vnet_feat_arc_ip4_unicast
    а запись через { .имя_поля=значение,...} это удобный способ инициализировать структуры
    Ответ написан
    1 комментарий
  • Как лучше всего реализовать хранение "шаблонов" файлов?

    @rPman
    Хранение блобов в файле программы (оно будет мапиться на адресное пространство и читаться эффективнее fread) в .data секции, создать объектные файлы с помощью objcopy или генерировать константы массивов с 0xXX с помощью xdd

    https://caiorss.github.io/C-Cpp-Notes/resources-ex...
    Ответ написан
    Комментировать
  • Как скрыть адрес вызываемой функции в C++?

    @rPman
    В коде, указанном в вопросе написана белиберда
    В конструкторе предлагаешь сделать присваивание
    vProtect = Protect;
    глобальной переменной vProtect имя класса Protect (потому что у тебя Protect и класс и переменная типа cProtect, (то что компилятор тебе это позволил уже бардак), если переименовать cProtect мембер Protect в protect (как рекомендует большинство code styling - имена классов с большой буквы, имена переменных - с маленькой, чтобы не запутаться), а еще тип vProtect у тебя - указатель, а Protect - нет, если будут оба указатели то само собой все будет собираться, но все равно смысла это иметь не будет.
    -----------------------

    Теперь про твой вопрос в заголовке, почти ничего не имеющий общего с текстом вопроса:
    Как скрыть адрес вызываемой функции в C++?
    в контексте обфускации, подразумевается что по декомпилированному исходному коду должно быть не ясно, какой именно метод будет вызываться (т.е. для анализа требуется отладка, что сложнее/дороже), значит хранить адреса методов нужно в каких то переменных, например массивах, а выбор следующего вызываемого метода делать на основе каких то вычислений по коду.

    В c++ для этого реализован класс std::function, пример использования для вызова именно метода класса (для простоты пример без аргументов но с аргументами все то же самое, надеюсь ты понимаешь, что у тебя должны быть одинаковые аргументы и типы во всех методах, или должны быть группы для разных типов, но чем больше групп тем проще анализ кода, иначе тупо по типам и количеству аргументов все можно будет понять)
    // определяем класс
    class MyClass
    {
      public:
      void myFunA(){std::cout<<"A";};
      void myFunB(){std::cout<<"B";};
    };

    однократно где то инициализируешь массив адресов функций (никто не мешает по коду это перемешивать)
    std::function<void(MyClass*)> functions[]={&MyClass::myFunA,&MyClass::myFunB};

    вызов метода по номеру x
    MyClass obj;
    functions[x](&obj);
    Ответ написан
    3 комментария
  • Как узнать размер незаполненного массива в c++?

    @rPman
    для массивов изменяемого размера используй std::vector (а так же для разнообразия std::deque, std::list, а если к примеру значения уникальные то std::map а вообще контейнеров списков в c++ много)

    это примерно в 2-3 раза медленнее и кушает память, бонусом будет контроль выхода за границы.

    само собой можно на основе обычных c-массивов и своего класса запилить под свои нужды и логику, например хранить рядом с массивом его текущую длину, при превышении текущего размера пересоздавать вдвое большего размера, а при двухкратном уменьшении - соответственно уменьшать)
    Ответ написан
    Комментировать
  • Как правильно подключать файлы?

    @rPman
    #pragma once
    в начале файла предотвращает его повторную загрузку

    В c и c++ принято разделять описание своих типов и классов на заголовочный файл .h и собственно код .cpp
    Заголовочные файлы подключаешь с помощью #include "xxx.h", а вот файлы cpp компилируются отдельно в .o (.obj для майкрософтовского компилятора) объектные файлы и из этих объектных файлов линкер собирает итоговый exe-шник

    Все среды разработки делают сборку автоматически из твоих .cpp файлов, вызывая для каждого компилятор только когда они изменились и автоматически отслеживают взаимозависимости .h файлов (т.е. если два из 100 твоих файлов подключили xxx.h то при его измении будет пересобраны только эти два файла). Вручную эти зависимости описываются с помощью выбранной системы сборки, например make, там указываешь какой cpp файл от каких .h файлов зависит

    p.s. формально ты можешь подключить напрямую .cpp файл, препроцессор вообще их не различает, но из-за взаимозависимостей тебе будет сложно это делать
    Ответ написан
    Комментировать
  • Что написать на C++ для практики?

    @rPman
    Реши любую задачу с многопоточностью и общей памятью, какой-нибудь сервер например.
    Или, к примеру, возьми тяжелый проект типа исходники браузера firefox/chromium и модифицируй их полезным образом (в этой области даже простая возможность настроить окружение, чтобы собрать этих монстров из исходников - уже плюс, а уж способность найти в исходниках нужное место и подправить - однозначно велком).
    p.s. помню не осилил отладку openjdk jni кода (для этого нужно не просто настроить окружение для сборки java но и настроить отладку в ней) и искал баг в портируемом коде jni, роняющем java, по старинке логированием, полагаю если сумеешь настроить сборку и отладку, можно наверное сразу на мидла претендовать.

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

    p.s. если работодатель ищет c++-ника, его явно не интересуют конечные задачи, это могут запилить рядовые программисты на любом другом высокоуровневом языке программирования, а интересуют не сами знания, а интеллект
    Ответ написан
  • Можно ли выделить память определенного размера?

    @rPman
    Если у тебя в итоге размер этого buf будет известен на этапе компиляции, то можно воспользоваться шаблонами
    template<int SIZE> struct MyStruct {
      int a;
      char buf[SIZE];
    };
    ...
    auto x=new MyStruct<10>; // x - указатель на MyStruct
    или
    const int size=10;
    auto x=new MyStruct<size>;
    ...
    delete x;
    Ответ написан
  • Вопрос по оформлению кода C++?

    @rPman
    Coding style должен быть таким, как определено в вашей команде
    Если это твоя команда - решение принимать нужно после общения со своей командой, выбрав тот стиль, наименее конфликтующий с их стилями.

    Если это твой проект - делай так как тебе удобно, я серьезно.
    Можно в качестве основы почитать про мировую практику, причем смотри, с какой целью это делается.
    Ответ написан
    2 комментария
  • Как это можно реализовать?

    @rPman
    Так чем не нравится шаблон?

    окей, создай промежуточную функцию, где определи весь свой код со значением твоего enum в параметрах, можно даже пометить ее inline чтобы наверняка, если не доверяешь автоматической оптимизации

    temlate <typename Derived1Enum> inline void Derived1::_someMethod(const Derived1Enum _state) {
    ...одинаковый код...
    state = _state
    ...одинаковый код...
    }
    void Derived1::someMethod() {
    _someMethod(Derived1Enum::SomeStateDerived1)
    }
    void Derived2::someMethod() {
    _someMethod(Derived2Enum::SomeStateDerived2)
    }

    upd. подправил с использованием шаблона
    Ответ написан
  • Почему запускается деструктор в данном примере?

    @rPman
    Сам copy никак не вызывает деструктор
    деструктор будет вызван автоматически по завершению области действия места где объект был создан, т.е. после завершения main

    Если же ты добавляешь *this в return Copy то у тебя возникает вызов деструктора этого возвращенного объекта, который не используется, а затем еще раз по завершению программы, собственно программа у тебя будет мусор на экран выводить вместо ожидаемого hi.

    Добавь в деструктор вывод на экран "destructor", увидишь

    Причина (если честно для меня не очевидная) в том что ты мешаешь два подхода - работа с объектами и работа со ссылкой на объект, преобразованный в сам объект (return *this), рекомендуется не мешать эти два подхода
    Ответ написан
    Комментировать
  • Почему разный результат байт?

    @rPman
    У тебя разные типы данных и соответственно размеры int это 4 байта (или 8 в зависимости от компилятора и архитектуры) и char - 1 байт
    int in_stream[100]
    и
    char packet_data[100];

    memcpy работает с байтами а значит копирует только часть данных
    Ответ написан
  • Есть ли что то вроде api, который позволял бы компилировать программу из под исполняемого файла?

    @rPman
    почему нет, все есть, та же libcxx

    так же для работы с исходниками существуют библиотеки, позволяющие проанализировать код и работать с его структурой, например для поиска и рефакторинга (на их основе делают ide)
    Ответ написан
    Комментировать
  • Как организовать статическую реализацию интерфейса?

    @rPman
    Использование виритуальных методов идеологически подразумевают наличие экземпляра объекта, тип которого по исходникам не известен и используется базовый тип предка, но прописан в таблице виртуальных методов (ссылка на которую будет таскать каждый экземпляр объекта). Да, было бы классно иметь доступ к этой таблице методов синтаксически но такова селяви.

    Поэтому в с++ нельзя быть одновременно virtual и static (а у тебя тебя еще веселее, предок не статичный а потомка ты пытаешься сделать статичным)

    Обходят это созданием промежуточных методов и даже класса, где методы не статичные но для них создается фиктивный пустой объект (для него можно написать отдельную пустую инициализацию) в котором собраны все виртуальные методы. Сам этот объект в классе уже определен static.

    Лично я считаю это достаточно неудобным чтобы вообще оставить static в принципе, лучше без него тогда
    Ответ написан
  • Что делать, если не открывается приложения Windows Form?

    @rPman
    я тут вижу два разных языка - c++ и manged c (на нем написано приложение win form)

    выбор языка определяется в момент создания проекта, именно это определяет как это будет запускаться

    если же у тебя два проекта в solution то там же есть настройка, какой запускать

    p.s. чтобы из одного проекта вызывать код другого, этот другой должен быть библиотекой dll (повторяю, отдельный проект в солюшне), там и точка входа называется по другому

    пример доки, как вызывать из managed кода unmanaged (тот что ты на c++ хочешь)
    Ответ написан
    6 комментариев
  • Как взаимодействовать с txt файлом, находящимся на сервере, с помощью с++?

    @rPman
    Вопросов тьма, от ответов на них зависит и результат
    Например - сервер доступен ли по какому то протоколу?
    во всех операционных системах можно настроить какой-нибудь протокол smb/nfs/ftp/http/ssh/... все они позволяют получить доступ к файлу так или иначе.
    Это вопрос не программирования а devops, настроить соответствующее приложение-сервер, на стороне клиента есть очень универсальная библиотека - libcurl (и одноименная утилита) умеет наверное все популярные и не очень протоколы.

    Само собой можно написать свой сервер по своим правилам (гуглить socket server c++) но стоит ли?

    p.s. netcat, консольная утилита, позволяет отправить через пайпы содержимое файла в сетевой сокет а на другой стороне соответственно наоборот принять, способ тупой, простой, на основе его и баш можно сделать однострочник сервер для отправки файла любому подключившемуся.
    Ответ написан
    6 комментариев
  • Как сохранить значения нескольких переменных в С++ 17?

    @rPman
    я так понимаю человек желает аналог php-шного list
    list($normal_weight, $weight)=getInfo();

    в таких языках как C+ (да и C) идеологически парные переменные объединяют в классы (структуры), с которыми = работает как копирование всей структуры.

    struct NormalWeight {int normal_weight, weight};
    // ...
    NormalWeight nm=getInfo();
    if (nm.weight > nm.normal_weight)
    Ответ написан
  • Как скомпилировать консольное приложение для Android?

    @rPman
    Общая идея android приложений - это dalvik bytecode (обычно это java) виртуальная машина, но разрешается использовать нативные библиотеки

    Соответственно пишешь минимальное приложение на java (пусть даже без gui, а вывод при необходимости делать в системные логи), которое первым делом подключит библиотеку, которую так же помещаешь в apk.

    Исторически это называется java native interafce, позволяет навести мосты между java приложением и нативным c/c++.

    дока - https://developer.android.com/studio/projects/add-...
    немного про android jni - https://developer.android.com/training/articles/pe... там же слева смотри ссылки как собирать

    Это очень трудоемкий путь, помимо того что придется пробираться через дебри jni прослойки и ограничений, понадобится поддерживать все многообразие железа (архитектур) причем как 32-битных так и 64-битных, где уже на этапе их сборки и отладки появится миллион проблем, т.е. не только x86 но и arm, причем последний это не пара а много много - arm64-v8a , armeabi , armeabi-v7a ... (больше если надо поддерживать старое железо)
    Ответ написан
    Комментировать
  • Как создать jpg файл в winapi используя картинку из буфера?

    @rPman
    интересно ты совсем не умеешь гуглить или не пробовал даже?
    winapi clipboard image example
    Ответ написан
    Комментировать
  • Отсутсвуют экземпляры перегруженная функция «pow»?

    @rPman
    у pow два параметра, а в указанном месте только один
    компилятор не нашел такой функции с одним параметром и честно об этом сказал
    Ответ написан
    Комментировать
  • Почему не компилируется любой C/C++ код в Visual Studio?

    @rPman
    попробуй переустановить студию (только ее), вполне возможно что вовремя установки компоненты устанавливались вручную не в томи порядке в котором ожидал майкрософт
    https://4systems.ru/inf/e1696-ne-udaetsja-otkryt-i...
    Ответ написан