c与cpp,在编译上有区别吗?深入浅出MFC上的实例generic.c为何改成cpp无法编译呢?
我刚学习 "深入浅出 MFC",刚才练习整本书中的第一个示例,就是窗口的注册与创建.
书上的源码 generic.c 的后缀是 c,但是我用 vc6 建的工程,自动把后缀保存成 generic.cpp了.
最后就是无法通过编译.最好我将 generic.cpp 改成 generic.c ,就通过编译了.
运行正常,窗口产生了.我不解.
1.c 和 cpp,在编译上有区别吗?2.vc6建工程,如何创建后缀是 C 的源文件呢?好像只要新写的代码,保存时就存成 .cpp 了.除非加入一个 C 后缀的文件.3.深入浅出的第一个示例,用vc6来练习的话,要建立什么工程呀?
 好像不管什么工程,源文件,都自动保存成 CPP 呀.

解决方案 »

  1.   

    VC6啊,太久远了,记不清了,把代码贴出来看看吧。默认源文件名就是cpp吧,既然叫VC++6.0,当然不会默认是.c了,文件名可以自己指定的,不过编译都是C++的编译器就是了。
      

  2.   

    generic.c#include <windows.h>
    #include "resource.h"
    #include "generic.h"HINSTANCE _hInst;
    HWND _hWnd;char _szAppName[]="Generic";
    char _szTitle[]="Generic Sample Sample Application";int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
     LPSTR lpCmdLine,int nCmdShow)
    {
    MSG msg;
    UNREFERENCED_PARAMETER(lpCmdLine);
    if (!hPrevInstance)
    if (!InitApplication(hInstance))
    return (FALSE);
    if (!InitInstance(hInstance,nCmdShow))
    return (FALSE); while (GetMessage(&msg,NULL,0,0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    } return (msg.wParam);
    }BOOL InitApplication(HINSTANCE hInstance)
    {
    WNDCLASS  wc;  wc.style         = CS_HREDRAW | CS_VREDRAW;
      wc.lpfnWndProc   = (WNDPROC)WndProc;     
      wc.cbClsExtra    = 0;
      wc.cbWndExtra    = 0;
      wc.hInstance     = hInstance;
      wc.hIcon         = LoadIcon(hInstance, "jjhouricon");
      wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
      wc.hbrBackground = GetStockObject(WHITE_BRUSH);  
      wc.lpszMenuName  = "GenericMenu";               
      wc.lpszClassName = _szAppName;  return (RegisterClass(&wc));
    }
    BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
    { //_hInst=hInstabce;
    _hInst = hInstance; 
    _hWnd=CreateWindow(
    _szAppName,
    _szTitle,
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    NULL,
    NULL,
    hInstance,
    NULL
    );
    if (!_hWnd)
    return (FALSE); ShowWindow(_hWnd,nCmdShow);
    UpdateWindow(_hWnd);
    return (TRUE);
    }LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    int wmId,wmEvent;
    switch (message)
    {
    case WM_COMMAND:
    wmId=LOWORD(wParam);
    wmEvent=HIWORD(wParam); switch (wmId)
    {
    case IDM_ABOUT:
    DialogBox(_hInst,
    "AboutBox",
    hWnd,
    (DLGPROC)About
    );
    break;
    case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
    default:
    return(DefWindowProc(hWnd,message,wParam,lParam));
    } break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return (DefWindowProc(hWnd,message,wParam,lParam));
    }
    return (0);
    }LRESULT CALLBACK About(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
    {
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
    return (TRUE);
    case WM_COMMAND:
    if (LOWORD(wParam)==IDOK || LOWORD(wParam)==IDCANCEL)
    {
    EndDialog(hDlg,TRUE);
    return(TRUE);
    }
    break;
    }
    return (FALSE);
    }
      

  3.   

    generic.hBOOL InitApplication(HANDLE);
    BOOL InitInstance(HANDLE,int);
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    LRESULT CALLBACK About(HWND,UINT,WPARAM,LPARAM);
    resource.h//---------------------------------------------------------------------
    //        resource.h
    //---------------------------------------------------------------------
    #define IDM_NEW                         40001
    #define IDM_OPEN                        40002
    #define IDM_SAVE                        40003
    #define IDM_SAVEAS                      40004
    #define IDM_PRINT                       40005
    #define IDM_PRINTSETUP                  40006
    #define IDM_EXIT                        40007
    #define IDM_UNDO                        40008
    #define IDM_CUT                         40009
    #define IDM_COPY                        40010
    #define IDM_PASTE                       40011
    #define IDM_LINK                        40012
    #define IDM_LINKS                       40013
    #define IDM_HELPCONTENTS                40014
    #define IDM_HELPSEARCH                  40015
    #define IDM_HELPHELP                    40016
    #define IDM_ABOUT                       40017
      

  4.   

    注:其中第一个 generic.c 如果文件是 generic.cpp ,就不能通过编译.对个,还有 RC 文件://---------------------------------------------------------------------
    //   generic.rc
    //---------------------------------------------------------------------
    #include "windows.h"
    #include "resource.h"jjhouricon ICON    DISCARDABLE     "jjhour.ico"GenericMenu MENU DISCARDABLE
    BEGIN
        POPUP "&File"
        BEGIN
            MENUITEM "&New",              IDM_NEW, GRAYED
            MENUITEM "&Open...",          IDM_OPEN, GRAYED
            MENUITEM "&Save",             IDM_SAVE, GRAYED
            MENUITEM "Save &As...",       IDM_SAVEAS, GRAYED
            MENUITEM SEPARATOR
            MENUITEM "&Print...",         IDM_PRINT, GRAYED
            MENUITEM "P&rint Setup...",   IDM_PRINTSETUP, GRAYED
            MENUITEM SEPARATOR
            MENUITEM "E&xit",             IDM_EXIT
        END
        POPUP "&Edit"
        BEGIN
            MENUITEM "&Undo\tCtrl+Z",     IDM_UNDO, GRAYED
            MENUITEM SEPARATOR
            MENUITEM "Cu&t\tCtrl+X",      IDM_CUT, GRAYED
            MENUITEM "&Copy\tCtrl+C",     IDM_COPY, GRAYED
            MENUITEM "&Paste\tCtrl+V",    IDM_PASTE, GRAYED
            MENUITEM "Paste &Link",       IDM_LINK, GRAYED
            MENUITEM SEPARATOR
            MENUITEM "Lin&ks...",         IDM_LINKS, GRAYED
        END
        POPUP "&Help"
        BEGIN
            MENUITEM "&Contents",               IDM_HELPCONTENTS, GRAYED
            MENUITEM "&Search for Help On...",  IDM_HELPSEARCH, GRAYED
            MENUITEM "&How to Use Help",        IDM_HELPHELP, GRAYED
            MENUITEM SEPARATOR
            MENUITEM "&About Generic...",       IDM_ABOUT
        END
    ENDAboutBox DIALOG DISCARDABLE  22, 17, 144, 75
    STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
    CAPTION "About Generic"
    BEGIN
        CTEXT           "Windows 95",         -1,0, 5,144,8
        CTEXT           "Generic Application",-1,0,14,144,8
        CTEXT           "Version 1.0",        -1,0,34,144,8
        DEFPUSHBUTTON   "OK",              IDOK,53,59,32,14,WS_GROUP
    END
      

  5.   

    CALLBACK 是 __stdcall,标准C不支持。所以VC已经把这段代码按照C++编译了。
      

  6.   

    你说反了吧,是 cpp 无法通过编译, c 扩展名可以通过编译呀.