C++ точка входа как статический метод

Тема в разделе "LANGS.C", создана пользователем float, 26 дек 2010.

  1. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    Нельзя ли в С++ сделать точку входа, указывающую на статический метод? как в шарпе. (зачем - интересно)

    Код (Text):
    1. class x
    2. {
    3. static int main(int argc,char* argv[])
    4. {
    5.   printf("dfghjkl;");
    6.   return 0;
    7. }
    8. }
    пробовал x::main, main@x, - не прокатило.
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    вообще, я думаю, что CRT-точке входа абсолютно все равно, будет ли ваша точка входа внутри класса или вне его, будет ли она статичная или нет... ей достаточно указателя... вопрос в другом, как сделать так, чтобы линкер понял, что с символом main связана именно функция из класса... над этим надо подумать, так на вскидку можно попробовать объявить глобальный статический указатель на функцию с требуемым именем, и ему присвоить значение указателя на функцию...

    а если забыть о CRT-точке входа, можно в параметр линкера передать магнленное иия функции члена класса... но не понятно, как быть с классом, так как без должных CRT-инициализаций классы могут некорректно работать...
     
  3. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    так и думал что без костылей не получится
     
  4. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    вообще то нет. У меня не консольное приложение, а простое, это я как пример просто написал. Инициализации мне не нужны никакие. Сейчас попробую просто передать мангленное имя линкеру но не в консольном проекте
     
  5. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Можно, с хаками, минимальными, если переменная класса статическая, дальше тоже можно но проблемы ваши.
    Там костылей не особо много, только основы COM знать.Rel
    Это и так и нет. Абсолютно и фактически есть разница по стандарту. Иначе только ASM - переходником
     
  6. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    Все же помогите заманглить метод мейн:

    Код (Text):
    1. #include <Windows.h>
    2.  
    3. class Program
    4. {
    5. public:
    6.  
    7.     static int __stdcall main(DWORD,DWORD,DWORD,DWORD)
    8.     {
    9.         MessageBoxA(0,"sad","",0);
    10.         return 0;
    11.     }
    12. };
    а то в единственном во всем интернете доке это уж очень нереально расписано.
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    причем тут консольное-неконсольное? CRT-точка входа стандартно есть и в консольном, и в вин32, и в длл... если вы задаете линкеру свою точку входа, то соответственно CRT-точка входа вызываться не будет... дело в другом, если я ничего не путаю (можете посмотреть в исходниках какого-нить простенького CRT вроде WCRT или tlibc), одна из функций CRT-точки входа - последовательный вызов цпп инициализаторов... вроде как они имеют какое-то отношение к вызову конструкторов и деструкторов классов вашего проекта, что в результате может вылиться в существенный костыль... если я ничего не путаю...

    поясните, чет не понял...
     
  8. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    может я что-то не понял но я вот взял и отключил все кроме kernel32.lib, user32.lib. И там всеравно идут инициализации?
     
  9. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    float
    Испрльзуйте свою главную функцию, которая будет вызывать функцию класса. Если вы пытаетесь вызвать функцию класса или назначать ее точкой входа вы просто долбоеб! И я готов ответить и обьяснить все что я сказал!
     
  10. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    floatВаша проблема создать минимальное приложение!
    Умейте формировать задачи! Мать вашшшшу!
     
  11. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    ну если я долбоеб, тогда объясните мне, откуда у класса могут быть функции?

    а зачем - я уже написал, что не для практического применения.
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Код (Text):
    1. #include <iostream>
    2.  
    3. class x
    4. {
    5.     __declspec(dllexport) int main(int argc,char* argv[])
    6.     {
    7.       std::cout<<"dfghjkl;";
    8.       return 0;
    9.     }
    10. };
    В VS2010 работает и даже без static. ^)
     
  13. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Разделите задачу на подзадачи и только после этого спрашивайте!
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    нет, CRT-точки входа вроде в msvcrt или в libc... вопрос в другом... почему вы думаете, что сможете без них обойтись)))
     
  15. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    спасибо, как минимум теперь я знаю что так можно. осталось только заманглить метод, желательно в своем неймспейсе.
     
  16. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    насколько я помню, без них тоже все работает, по крайней мере MessageBox

    Код (Text):
    1. 1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ __RTC_CheckEsp в функции _main@16
    ой.
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    float
    Зачем? Точка входа - x::main работает.
     
  18. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    float
    ну если я долбоеб, тогда объясните мне, откуда у класса могут быть функции?
    Вы меня простите но эти постом вы все решили
    Любая функция есть процедура! Изменяется только модель вызова!
    Хорошо. Я не буду голословным!
    Либо Booster и оля __declspec() либо
    либо класс-синглтон, пока нет мнений!
    Точка входа просто адресс как вы не поймете!
     
  19. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    1>LIBCMT.lib(crt0.obj) : error LNK2001: неразрешенный внешний символ "_main"

    или надо обязательно с msvcrt?
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    float
    У меня это не влияет, включил Ignored all default libraries и всё по прежнему. Студия конечно пишет:
    Код (Text):
    1. 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
    Но линкует нормально.