解决方案取决于您使用的编译器和链接器。始终不是 main 是应用程序的真正入口点。真正的入口点进行一些初始化并调用例如main。如果您使用 Visual Studio 为 Windows 编写程序,您可以使用链接器的 /ENTRY 开关覆盖默认入口点 mainCRTStartup 并调用 func() 而不是 main():
#ifdef NDEBUG
void mainCRTStartup()
{
ExitProcess (func());
}
#endif
如果您编写最小的应用程序,这是一种标准做法。在这种情况下,您将收到使用 C-Runtime 函数的限制。您应该使用 Windows API 函数而不是 C-Runtime 函数。例如,您应该使用OutputString(TEXT("This is func \n")) 而不是printf("This is func \n"),其中OutputString 仅针对WriteFile 或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));
}