Возможно ли такое? Т.е. оставить только 3-4 простых типа - byte, word, dword, float + составные типы (массивы, записи) Подозреваю, что такое невозножно, но можно ли както приблизиться к этому?
Ursus зачем сразу компилер? компилер в си наманый. и встроенных типов хватает для выполнения задачи. а всякие HANDLE HINSTANCE можно исключить, юзать unsinged long вместо них и будет щастье
Давно хочу. Только на это уйдет слишком много времени, проще написать нужную прогу на асме, чем писать для нее ЯВУ. Проблема в том, что в асме все хорошо, кроме арифметики. А в Си(++) все хорошо, кроме указателей и типов вообще. Я в принципе допускаю, что (DWORD*)p+1==(BYTE*)p+4, но писать всюду (DWORD*) или (char*) меня раздражает. Кроме того, в ряде случаев приведение типов вообще не помогает. Например я могу получить указатель на функцию (char*)&Func, но я не могу сделать тоже самое с методом, т.к. компилятор может приводить функции к (char*), а методы не может. Ладно бы компилятор не знал адрес метода, но этот метод импортируется из длл, так что его адрес известен. хз, может я просто успел привыкнуть к асму, где тип определяется разрядностью операнда.
Booster Если что, речь шла не о проблеме импорта метода из длл. Прочитал бы сначала весь пост а не последнюю фразу %)
Напиши свой препроцессор. В Visual Studio есть очень полезная опция Generate Preprocessed File. Можешь сначала скормить исходники cl.exe с ключами /EP /P а потом сделать замену на регеспах. Таким образом можно пропатчить вижуал с++ студию на предмет более универсальных макросов для твоего препроцессора.
GoldFinch Читал, и могу тебя огорчить, типизацию нельзя отключить, иначе это будет не С. А написал я свой предидущий пост потому, так как вижу что неверно понимаешь механизм экспорта и объекты в C++. Приводится там нормально. И вообще если тебе мешает типизация, пиши на асме. То что лениво писать оператор приведения это не повод отказываться от этого в С.
GoldFinch Само собой. Более того - это признак плохого стиля. В грамотно написанном коде приведений типов очень мало.Ты просто неправильно используешь С++. Может. Только зачем? Метод должен использоваться с объектом, а не как свободная ф-ция. См. указатели на члены класса.
green напиши как перехватить импортируемый метод сплайсингом, в начале метода уже стоит jmp near xxx, надо его перенаправить на другой метод\функцию я могу сделать такое только с функцией, и только с конструкциями типа (DWORD*)(char*)pFunc+1, как сделать такое с методом я вообще хз.
GoldFinch почитай hччtp://www.codeproject.com/KB/cpp/FastDelegate.aspx чтобы понять лучше, как реализуется функция-член в С++
так или иначе, если в асме я пишу много рутинного кода, то в С(++) я пишу *мало* кода, и *много* еще более рутинных описаний типов, прототипов, и прочей избыточной информации, нужной только компилятору только для проверок на "ошибки" =\
GoldFinch Вот так можно получить адрес метода (в сложных случаях вроде виртуального наследования работать не будет - там нужно по другому). Код (Text): template<class MT> char *GetMethodAddr(MT m) { return *(char **)&m; } // Пример использования: class C { public: int SomeMethod(); }; char *pC_Method = GetMethodAddr(&C::SomeMethod);
GoldFinch Ну так и скажи - "асм рулез, C++ гумно". Ты записи в дельфи не попутал случаем? byte, word, dword - это дефайны. Основные char, int, long, float, double и ещё чуток. Не так уж и много.
Заведи себе какой-нибудь UNION вpоде {void* AsPvoid; int AsDWORD; char *AsPchar} , обращайся к его полям и выгребай потом глюки типа "тут мне очень хотелось спать и я случайно зевнул букву D в слове DWORD" большой совковой лопатой. Или скажи компилятору, что отныне он не С++, а K&R C - там контроль типов был кастратный по самую шею. Заодно и ТруЪ Олд-скулЪ СиЪ СтайлЪ описания функций освоишь.