Нельзя ли в С++ сделать точку входа, указывающую на статический метод? как в шарпе. (зачем - интересно) Код (Text): class x { static int main(int argc,char* argv[]) { printf("dfghjkl;"); return 0; } } пробовал x::main, main@x, - не прокатило.
вообще, я думаю, что CRT-точке входа абсолютно все равно, будет ли ваша точка входа внутри класса или вне его, будет ли она статичная или нет... ей достаточно указателя... вопрос в другом, как сделать так, чтобы линкер понял, что с символом main связана именно функция из класса... над этим надо подумать, так на вскидку можно попробовать объявить глобальный статический указатель на функцию с требуемым именем, и ему присвоить значение указателя на функцию... а если забыть о CRT-точке входа, можно в параметр линкера передать магнленное иия функции члена класса... но не понятно, как быть с классом, так как без должных CRT-инициализаций классы могут некорректно работать...
вообще то нет. У меня не консольное приложение, а простое, это я как пример просто написал. Инициализации мне не нужны никакие. Сейчас попробую просто передать мангленное имя линкеру но не в консольном проекте
Можно, с хаками, минимальными, если переменная класса статическая, дальше тоже можно но проблемы ваши. Там костылей не особо много, только основы COM знать.Rel Это и так и нет. Абсолютно и фактически есть разница по стандарту. Иначе только ASM - переходником
Все же помогите заманглить метод мейн: Код (Text): #include <Windows.h> class Program { public: static int __stdcall main(DWORD,DWORD,DWORD,DWORD) { MessageBoxA(0,"sad","",0); return 0; } }; а то в единственном во всем интернете доке это уж очень нереально расписано.
причем тут консольное-неконсольное? CRT-точка входа стандартно есть и в консольном, и в вин32, и в длл... если вы задаете линкеру свою точку входа, то соответственно CRT-точка входа вызываться не будет... дело в другом, если я ничего не путаю (можете посмотреть в исходниках какого-нить простенького CRT вроде WCRT или tlibc), одна из функций CRT-точки входа - последовательный вызов цпп инициализаторов... вроде как они имеют какое-то отношение к вызову конструкторов и деструкторов классов вашего проекта, что в результате может вылиться в существенный костыль... если я ничего не путаю... поясните, чет не понял...
может я что-то не понял но я вот взял и отключил все кроме kernel32.lib, user32.lib. И там всеравно идут инициализации?
float Испрльзуйте свою главную функцию, которая будет вызывать функцию класса. Если вы пытаетесь вызвать функцию класса или назначать ее точкой входа вы просто долбоеб! И я готов ответить и обьяснить все что я сказал!
ну если я долбоеб, тогда объясните мне, откуда у класса могут быть функции? а зачем - я уже написал, что не для практического применения.
Код (Text): #include <iostream> class x { __declspec(dllexport) int main(int argc,char* argv[]) { std::cout<<"dfghjkl;"; return 0; } }; В VS2010 работает и даже без static. ^)
нет, CRT-точки входа вроде в msvcrt или в libc... вопрос в другом... почему вы думаете, что сможете без них обойтись)))
спасибо, как минимум теперь я знаю что так можно. осталось только заманглить метод, желательно в своем неймспейсе.
насколько я помню, без них тоже все работает, по крайней мере MessageBox Код (Text): 1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ __RTC_CheckEsp в функции _main@16 ой.
float ну если я долбоеб, тогда объясните мне, откуда у класса могут быть функции? Вы меня простите но эти постом вы все решили Любая функция есть процедура! Изменяется только модель вызова! Хорошо. Я не буду голословным! Либо Booster и оля __declspec() либо либо класс-синглтон, пока нет мнений! Точка входа просто адресс как вы не поймете!
1>LIBCMT.lib(crt0.obj) : error LNK2001: неразрешенный внешний символ "_main" или надо обязательно с msvcrt?
float У меня это не влияет, включил Ignored all default libraries и всё по прежнему. Студия конечно пишет: Код (Text): Warning 1 warning LNK4216: Exported entry point ?main@x@@AAEHHQAPAD@Z (private: int __thiscall x::main(int,char * * const)) E:\Coding\Visual Studio 10 Projects\C++\Test\Proj_014\Proj_014\LINK Proj_014 Но линкует нормально.