为啥我在一个VC++程序中找不到主函数main啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥我在一个VC++程序中找不到主函数main啊?相关的知识,希望对你有一定的参考价值。

我最近在学习VC++,在一个中型的工程中,我怎么样也找不到 像 int main() ; void main () 或者是 winmain 这样的主函数,请问有没有编程高手告诉我到底是怎么回事啊?这个工程人家已经应用了,不可能是错误的,但是我用搜索工具找了,就是没有,请问他的主函数到底是怎么声明的啊?

在DOS下,程序的执行是从main函数开始的。在Windows下,对应的函数是WinMain。但是,如果浏览Hello程序的所有的方法和全局函数,是找不到WinMain函数的。MFC考虑到典型的Windows程序需要的大部分初始化工作都是标准化的,因此把WinMain函数隐藏在应用程序的框架中,编译时会自动将该函数链接到可执行文件中。程序员可以重写WinMain函数,但一般不需要这么做。

下面的程序清单3-1给出了WinMain函数的代码。其中,_tWinMain函数在\DevStudio\Vc\Mfc\src\AppModul.cpp中定义,它所调用的AfxWinMain函数在同一目录下的WinMain.cpp中定义。名字是_tWinMain函数而不是WinMain,是考虑到对不同字符集的支持,在tchar.h中有_tWinMain的宏定义。在ANSI字符集下编译时,_tWinMain就变成WinMain,在Unicode下编译时,_tWinMain就变成wWinMain。

提示:Unicode是具有固定宽度、统一的文本和字符的编码标准。由于Unicode采用的是16位编码,因此可以包含世界各地的书写系统的字符和技术符号(如中文也在Unicode之中),从而克服了ASCII码在表示多语言文本上的不足之处,扩大了ASCII码7位编码方案的好处。Unicode同等地对待所有的字符,并且在表示各种语言的任何字符时既不需要换码序列(escape)也不需要控制代码。Win32和Visual C++很好的支持Unicode字符集。

清单3-1 _tWinMain函数定义

// export WinMain to force linkage to this module

extern int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPTSTR lpCmdLine, int nCmdShow);

#ifdef _MAC

extern "C" int PASCAL

#else

extern "C" int WINAPI

#endif

_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPTSTR lpCmdLine, int nCmdShow)



// call shared/exported WinMain

return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);



AfxWinMain函数定义:

/////////////////////////////////////////////////////////////////////////////

// Standard WinMain implementation

// Can be replaced as long as 'AfxWinInit' is called first

int AFXAPI AfxWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPTSTR lpCmdLine, int nCmdShow)



ASSERT(hPrevInstance == NULL);

int nReturnCode = -1;

CWinApp* pApp = AfxGetApp();

// AFX internal initialization

if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))

goto InitFailure;

// App global initializations (rare)

ASSERT_VALID(pApp);

if (!pApp->InitApplication())

goto InitFailure;

ASSERT_VALID(pApp);

// Perform specific initializations

if (!pApp->InitInstance())



if (pApp->m_pMainWnd != NULL)



TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");

pApp->m_pMainWnd->DestroyWindow();



nReturnCode = pApp->ExitInstance();

goto InitFailure;



ASSERT_VALID(pApp);

nReturnCode = pApp->Run();

ASSERT_VALID(pApp);

InitFailure:

#ifdef _DEBUG

// Check for missing AfxLockTempMap calls

if (AfxGetModuleThreadState()->m_nTempMapLock != 0)



TRACE1("Warning: Temp map lock count non-zero (%ld).\n",

AfxGetModuleThreadState()->m_nTempMapLock);



AfxLockTempMaps();

AfxUnlockTempMaps(-1);

#endif

AfxWinTerm();

return nReturnCode;



应用程序执行时,Windows自动调用应用程序框架内部的WinMain函数。如清单3-1所示,WinMain函数会查找该应用程序的一个全局构造对象,这个对象是由CWinApp派生类构造的,有且只有一个。它是一个全局对象,因此在程序启动时,它就已经被构造好了。

随后,WinMain将调用这个对象的InitApplication和InitInstance成员函数,完成应用程序实例的初始化工作。随后,WinMain调用Run成员函数,运行应用程序的消息循环。在程序结束时,WinMain调用AfxWinTerm函数,做一些清理工作。

这是我在学vc时的资料里的一段话,希望对你有参考作用.
参考技术A 要是Win32 Console App程序的话就一定得有main();
要是Win32 App的话就得有WinMain();
要是基于MFC的话这个函数已经封装到类里面去了,你当然看不到。
参考技术B MFC的main函数可以在
WINMAIN.cpp中找到

int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)

winmain.cpp在
x:\program files\Microsoft Visual Studio\VC98\MFC\SRC
参考技术C mainFrm中可以找到 参考技术D VC中用另一个函数代替了,具体,我在学,呵,不太清楚啦。

错误:在类计算中找不到主方法,请将主方法定义为:public static void main(String[] args) [重复]

【中文标题】错误:在类计算中找不到主方法,请将主方法定义为:public static void main(String[] args) [重复]【英文标题】:Error: Main method not found in class Calculate, please define the main method as: public static void main(String[] args) [duplicate] 【发布时间】:2013-12-14 14:49:04 【问题描述】:

我需要有关 main 方法的帮助,我收到此错误:

Error: Main method not found in class Calculate, please define the main method as:
    public static void main(String[] args)

代码如下:

class Calculate 

private double fn;
private double sn;
private char op;

public void setNumber(double fnum, double snum)
    this.fn = fnum;
    this.sn = snum;

public double getNumber1()
    return fn;

public double getNumber2()
    return sn;

public void setOper(char oper)
    this.op = oper;

public char getOper()
    return op;

public void getAnswer()
    double ans;
    switch (getOper())
        case 'a': 
            ans = add(getNumber1(), getNumber2());
            ansOutput(ans);
            break;
        case 'b': 
            ans = sub (getNumber1(), getNumber2());
            ansOutput(ans);
            break;
        case 'c': 
            ans = mul (getNumber1(), getNumber2());
            ansOutput(ans);
            break;
        case 'd': 
            ans = div (getNumber1(), getNumber2());
            ansOutput(ans);
            break;
        default:
            System.out.println("--------------------------");
            System.out.println("Invalid choice of operator");
            System.out.println("--------------------------");
        
    
    public static double add(double x,double y)
        return x + y;
    
    public static double sub(double x, double y)
        return x - y;
    
    public static double mul(double x, double y)
        return x * y;
    
    public static double div(double x, double y)
        return x / y;
    

    public static void ansOutput(double x)
        System.out.println("----------- -------");
        System.out.printf("the answer is %.2f\n", x);
        System.out.println("-------------------");
    

【问题讨论】:

运行时确切地告诉您该做什么 - 您是否尝试过按照它的说明进行操作? (当您运行程序时,您希望调用什么?) 请再次阅读错误... 我尝试输入“public static void main(String[] args)”,但运行代码后,它给了我很多错误,我想我必须更改“void”之类的。真的很抱歉,还是个学生。 您在java 命令中命名的类必须包含一个main 方法,并具有规定的属性。这是您的程序开始执行的地方。 main 可以立即调用另一个方法,甚至另一个类,但是没有mainjava 命令不知道从哪里开始。 您可能在没有关联方法体的情况下输入了“public static void main(String[] args)”。它是一种方法,就像您的setNumber 是一种方法一样。 【参考方案1】:

重启你的IDE,一切都会好起来的

【讨论】:

有时最复杂的解决方案是最简单的步骤。 :) 在我的例子中,eclipse的“运行方式”配置突然切换到一个新创建的类,半小时我不明白为什么它需要非主类中的主方法。虽然重启没有帮助,但你给了我检查 IDE 设置的线索。 这也为我解决了这个问题:)【参考方案2】:

来自docs

在 Java 编程语言中,每个应用程序都必须包含一个 main 方法,其签名是:

public static void main(String[] args)

修饰符 public 和 static 可以按任意顺序编写(public static 或 static public),但约定是使用 public static,如上所示。您可以为参数命名任何您想要的名称,但大多数程序员选择“args”或“argv”。

如你所说:

错误:缺少方法体,或声明抽象 public static void main(String[] args); ^ 这是我在类名后面添加后得到的

您可能还没有使用主体声明 main(因为 ';" 会在您的错误中暗示)。

你需要有一个带有主体的main方法,这意味着你需要添加和:

public static void main(String[] args) 



将它添加到你的类定义中。

虽然有时错误消息不是很清楚,但大多数时候它们包含足够的信息来指出问题所在。最坏的情况,您可以在互联网上搜索错误消息。此外,文档真的很有帮助。

【讨论】:

【参考方案3】:

我的建议:

保持程序模块化。将Calculate 类保存在单独的Calculate.java 文件中,并创建一个调用main 方法的新类。这将使代码可读。

要设置数字中的值,请使用构造函数。不要像上面使用的方法那样使用:

public void setNumber(double fnum, double snum) 这个.fn = fnum; this.sn = snum;

构造函数的存在是为了初始化对象。这是他们的工作,他们很擅长。

Calculate 类成员的 Getter 似乎就位。但二传手不是。 Getter 和 setter 是使用 java 进行高效编程的桥梁中的一个重要部分。也为 fnum 和 snum 添加设置器

在主类中,使用 new 运算符和就地构造函数创建一个 Calculate 对象。

使用创建的 Calculate 对象调用 getAnswer() 方法。

其余代码对我来说看起来不错。 模块化。您可以以更好的方式阅读您的程序。

这是我的模块化代码。 两个文件:Main.java & Calculate.java

计算.java

public class Calculate 


private double fn;
private double sn;
private char op;

    public double getFn() 
        return fn;
    

    public void setFn(double fn) 
        this.fn = fn;
    

    public double getSn() 
        return sn;
    

    public void setSn(double sn) 
        this.sn = sn;
    

    public char getOp() 
        return op;
    

    public void setOp(char op) 
        this.op = op;
    



    public Calculate(double fn, double sn, char op) 
        this.fn = fn;
        this.sn = sn;
        this.op = op;
    


public void getAnswer()
    double ans;
    switch (getOp())
        case '+': 
            ans = add(getFn(), getSn());
            ansOutput(ans);
            break;
        case '-': 
            ans = sub (getFn(), getSn());
            ansOutput(ans);
            break;
        case '*': 
            ans = mul (getFn(), getSn());
            ansOutput(ans);
            break;
        case '/': 
            ans = div (getFn(), getSn());
            ansOutput(ans);
            break;
        default:
            System.out.println("--------------------------");
            System.out.println("Invalid choice of operator");
            System.out.println("--------------------------");
        
    
    public static double add(double x,double y)
        return x + y;
    
    public static double sub(double x, double y)
        return x - y;
    
    public static double mul(double x, double y)
        return x * y;
    
    public static double div(double x, double y)
        return x / y;
    

    public static void ansOutput(double x)
        System.out.println("----------- -------");
        System.out.printf("the answer is %.2f\n", x);
        System.out.println("-------------------");
    

Main.java

public class Main 
    public static void main(String args[])
    
        Calculate obj = new Calculate(1,2,'+');
        obj.getAnswer();
    

【讨论】:

混淆:“创建一个调用main方法的新类。”又是什么主要方法? @Ingo:现在清楚了吗? 更好。尽管我认为没有理由不在Calculate 本身中使用main。 (我过去几乎每堂课都有一个,它只是执行一个非常基本的自测,或其他什么。) @Ingo:我同意。这实际上取决于程序员自己。对我来说,它只是感觉更有条理,这就是为什么我将它保存为一个单独的文件。在每个 java 文件中保留一个 main 没有害处 :)【参考方案4】:

你写代码的地方

public class Main 
    public static void main(String args[])
    
        Calculate obj = new Calculate(1,2,'+');
        obj.getAnswer();
    

在这里,您必须运行“Main”类而不是您在程序开始时创建的类。为此,请转到运行配置并搜索此类名称“Main”,该类名称在 this(public static void main(String args[])) 中有 main 方法。你会得到你的输出。

【讨论】:

为什么 OP 想要一个新课程?为什么不直接告诉他/她如何将 main 方法添加到他/她现有的类中?【参考方案5】:

你似乎没有创建一个 main 方法,它应该看起来像这样(我不确定)

  class RunThis

    public static void main(String[] args)
    

    Calculate answer = new Calculate();
    answer.getNumber1();
    answer.getNumber2();
    answer.setNumber(answer.getNumber1() , answer.getNumber2());
    answer.getOper();
    answer.setOper(answer.getOper());
    answer.getAnswer();
    

关键是你应该在某个类下创建了一个 main 方法,编译后你应该运行包含 main 方法的 .class 文件。在这种情况下,主要方法在 RunThis 下,即 RunThis.class。

我是java新手,这可能是正确的答案,也可能不是正确的答案,如果我错了,请纠正我

【讨论】:

以上是关于为啥我在一个VC++程序中找不到主函数main啊?的主要内容,如果未能解决你的问题,请参考以下文章

MFC没有main函数也可以执行吗?急

java无法找到或加载主类

当我在主函数之外初始化结构成员时,为啥这个 c 程序会出错?

main() 主函数是啥意思啊

为啥我在命令提示符中找不到 PIP? [复制]

错误:在类计算中找不到主方法,请将主方法定义为:public static void main(String[] args) [重复]