Avoiding the main (entry point) in a C program

前端 未结 7 2087
迷失自我
迷失自我 2020-12-01 10:50

Is it possible to avoid the entry point (main) in a C program. In the below code, is it possible to invoke the func() call without calling via main()

7条回答
  •  隐瞒了意图╮
    2020-12-01 11:40

    The solution depends on the compiler and linker which you use. Always is that not main is the real entry point of the application. The real entry point makes some initializations and call for example main. If you write programs for Windows using Visual Studio, you can use /ENTRY switch of the linker to overwrite the default entry point mainCRTStartup and call func() instead of main():

    #ifdef NDEBUG
    void mainCRTStartup()
    {
        ExitProcess (func());
    }
    #endif
    

    If is a standard practice if you write the most small application. In the case you will receive restrictions in the usage of C-Runtime functions. You should use Windows API function instead of C-Runtime function. For example instead of printf("This is func \n") you should use OutputString(TEXT("This is func \n")) where OutputString are implemented only with respect of WriteFile or WriteConsole:

    static HANDLE g_hStdOutput = INVALID_HANDLE_VALUE;
    static BOOL g_bConsoleOutput = TRUE;
    
    BOOL InitializeStdOutput()
    {
        g_hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);
        if (g_hStdOutput == INVALID_HANDLE_VALUE)
            return FALSE;
    
        g_bConsoleOutput = (GetFileType (g_hStdOutput) & ~FILE_TYPE_REMOTE) != FILE_TYPE_DISK;
    #ifdef UNICODE
        if (!g_bConsoleOutput && GetFileSize (g_hStdOutput, NULL) == 0) {
            DWORD n;
    
            WriteFile (g_hStdOutput, "\xFF\xFE", 2, &n, NULL);
        }
    #endif
    
        return TRUE;
    }
    
    void Output (LPCTSTR pszString, UINT uStringLength)
    {
        DWORD n;
    
        if (g_bConsoleOutput) {
    #ifdef UNICODE
            WriteConsole (g_hStdOutput, pszString, uStringLength, &n, NULL);
    #else
            CHAR szOemString[MAX_PATH];
            CharToOem (pszString, szOemString);
            WriteConsole (g_hStdOutput, szOemString, uStringLength, &n, NULL);
    #endif
        }
        else
    #ifdef UNICODE
            WriteFile (g_hStdOutput, pszString, uStringLength * sizeof (TCHAR), &n, NULL);
    #else
        {
            //PSTR pszOemString = _alloca ((uStringLength + sizeof(DWORD)));
            CHAR szOemString[MAX_PATH];
            CharToOem (pszString, szOemString);
            WriteFile (g_hStdOutput, szOemString, uStringLength, &n, NULL);
        }
    #endif
    }
    
    void OutputString (LPCTSTR pszString)
    {
        Output (pszString, lstrlen (pszString));
    }
    

提交回复
热议问题