2012-11-07 139 views
8

下午好。我已經開始學習C++,並且正在編譯我的項目。 如果你發現一些錯誤的代碼,我會很高興,如果你告訴我。C++錯誤C2653'類'不是類或名稱空間名稱

我有以下定義:

Utils.h

#include "stdafx.h" 
#include <string> 
using namespace std; 

class Utils 
{ 
public: 
static string GetStringFromInt (int number); 
}; 

Utils.cpp

#include "Utils.h" 
#include <sstream> 
#include <string> 
using namespace std; 

string Utils::GetStringFromInt (int number) 
{ 

    stringstream ss; 
    ss << number; 
    return ss.str(); 
} 

Ping.h

#include "stdafx.h" 
#include <string> 

using namespace std; 

class Ping 
{ 
public: 
    static int PingIt(int argc, char* argv[],string &mstime,string &ttl); 
}; 

Ping.cpp

#include "Ping.h" 
#include <string> 
#include "icmpdefs.h" 
#include <string> 
#include <iostream> 
#include <sstream> 
#include <WinSock.h> 
#include <Windows.h> 
#include "Utils.h" 
#pragma comment(lib,"wsock32.lib") 
using namespace std; 

int Ping::PingIt(int argc, char* argv[],string &mstime,string &ttl) 
{ 


    // Check for correct command-line args 
    if (argc < 2) { 
     cerr << "usage: ping <host>" << endl; 
     return 1; 
    } 

    // Load the ICMP.DLL 
    HINSTANCE hIcmp = LoadLibrary("ICMP.DLL"); 
    if (hIcmp == 0) { 
     cerr << "Unable to locate ICMP.DLL!" << endl; 
     return 2; 
    } 

    // Look up an IP address for the given host name 
    struct hostent* phe; 
    if ((phe = gethostbyname(argv[1])) == 0) { 
     cerr << "Could not find IP address for " << argv[1] << endl; 
     return 3; 
    } 

    // Get handles to the functions inside ICMP.DLL that we'll need 
    typedef HANDLE (WINAPI* pfnHV)(VOID); 
    typedef BOOL (WINAPI* pfnBH)(HANDLE); 
    typedef DWORD (WINAPI* pfnDHDPWPipPDD)(HANDLE, DWORD, LPVOID, WORD, 
      PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD); // evil, no? 
    pfnHV pIcmpCreateFile; 
    pfnBH pIcmpCloseHandle; 
    pfnDHDPWPipPDD pIcmpSendEcho; 
    pIcmpCreateFile = (pfnHV)GetProcAddress(hIcmp, 
      "IcmpCreateFile"); 
    pIcmpCloseHandle = (pfnBH)GetProcAddress(hIcmp, 
      "IcmpCloseHandle"); 
    pIcmpSendEcho = (pfnDHDPWPipPDD)GetProcAddress(hIcmp, 
      "IcmpSendEcho"); 
    if ((pIcmpCreateFile == 0) || (pIcmpCloseHandle == 0) || 
      (pIcmpSendEcho == 0)) { 
     cerr << "Failed to get proc addr for function." << endl; 
     return 4; 
    } 

    // Open the ping service 
    HANDLE hIP = pIcmpCreateFile(); 
    if (hIP == INVALID_HANDLE_VALUE) { 
     cerr << "Unable to open ping service." << endl; 
     return 5; 
    } 

    // Build ping packet 
    char acPingBuffer[64]; 
    memset(acPingBuffer, '\xAA', sizeof(acPingBuffer)); 
    PIP_ECHO_REPLY pIpe = (PIP_ECHO_REPLY)GlobalAlloc(
      GMEM_FIXED | GMEM_ZEROINIT, 
      sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer)); 
    if (pIpe == 0) { 
     cerr << "Failed to allocate global ping packet buffer." << endl; 
     return 6; 
    } 
    pIpe->Data = acPingBuffer; 
    pIpe->DataSize = sizeof(acPingBuffer);  

    // Send the ping packet 
    DWORD dwStatus = pIcmpSendEcho(hIP, *((DWORD*)phe->h_addr_list[0]), 
      acPingBuffer, sizeof(acPingBuffer), NULL, pIpe, 
      sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer), 5000); 
    if (dwStatus != 0) { 
     cout << "Addr: " << 
       int(LOBYTE(LOWORD(pIpe->Address))) << "." << 
       int(HIBYTE(LOWORD(pIpe->Address))) << "." << 
       int(LOBYTE(HIWORD(pIpe->Address))) << "." << 
       int(HIBYTE(HIWORD(pIpe->Address))) << ", " << 
       "RTT: " << int(pIpe->RoundTripTime) << "ms, " << 
       "TTL: " << int(pIpe->Options.Ttl) << endl; 

     mstime = Utils::GetStringFromInt((pIpe->RoundTripTime)); 
     ttl = Utils::GetStringFromInt(int(pIpe->Options.Ttl)); 
    } 
    else { 
     cerr << "Error obtaining info from ping packet." << endl; 
    } 

    // Shut down... 
    GlobalFree(pIpe); 
    FreeLibrary(hIcmp); 
    return dwStatus; 
} 

當我編譯項目我得到:

錯誤1個錯誤C2653: '平安':不是類或命名空間名稱c:\ users \ clanderasm \ documents \ visual studio 2010 \ projects \ landetestconsole \ landecplusconsole \ ping.cpp 14 1 LandeCplusConsole

我看過有時候會拋出這個錯誤,因爲你在第一個#include中不包含「stdafx.h」 ,但我已經改變了它。

如果你能告訴我更多的東西我會很高興

+3

還有其他警告嗎?也許它找不到'#include「Ping.h」'。另外,**永遠不會**使用名稱空間標準;'在標題。永遠。 – Collin

+1

Re:stdafx.h包含。它屬於**源**文件中的第一個#include;不是你的頭文件。每個頭文件應該包含任何它依賴於本地定義的東西,或者如果不需要文件獨立性,那麼在編譯伴隨源文件時,stdafx.h中沒有任何內容。 – WhozCraig

+0

@Collin不應該找到'Ping.h'導致錯誤而不是警告? –

回答

7

我不能給你的代碼複製你的錯誤,但我想在VS2008和一些它提出讓我覺得它很可能的警告很大程度上是由於您的預編譯頭文件不包含在源代碼中。而且還有一些其他的問題,我可以看到,一定會稍後會造成問題:

  • 不包括預編譯頭中的.h。 (那麼你應該避免在你的.h中包含任何東西,除非絕對必要)。預編譯頭文件(至少在可視化方面)是爲了在每個cpp文件(而不是.h)中首先包含。如果你不這樣做會提高警告,分別包括你喜歡:

    警告C4627:「#包括‘Ping.h’」:跳過尋找預編譯頭使用時< - 在這裏你走你的點類不再被定義!

    並最後出現錯誤致命錯誤C1010:查找預編譯頭文件時意外的文件結尾。你忘了添加'#include「stdafx.h」'到你的源?

    這實際上是我在VS2008上編譯代碼時得到的消息,也許在VS2010中,您有關於Point沒有被定義的錯誤。在整理預編譯頭文件的問題時,它編譯得很好(見下一點)

  • 使用預編譯頭文件並不意味着。用於構建它的h將自動包含在所有源中。爲此,您必須更改一些項目設置:右鍵單擊對您的項目 - >屬性,在左側窗格中,展開配置屬性 - > C/C++ - >高級。在右邊的列表中,您應該看到Force Includes。在這裏鍵入stdafx.h,並且不需要手動將它添加到項目中的每個新.cpp文件中。要注意的是你必須做的是對頂部的所有配置(組合框寫入「配置:活躍(調試)」

道歉,仍然是一個VS2008的屏幕,希望它在VS2010 enter image description here

相同
  • 保護你的頭你應該把GARDS你的頭,以避免你的類的多個定義在多個包含相同.H的發生(將會) 你可以這樣做2種方式:。該定義方法,和編譯指示的方法 編譯指示ce不是標準的,但在Visual上編譯速度更快,所以你最終可以混合使用2種方法。

myheader.h使用編譯一次:

#pragma once 
class MyClass 
{ 
    //<some definitions> 
}; 

使用myheader.h定義:

#ifndef __MYHEADER_H 
#define __MYHEADER_H 
class MyClass 
{ 
    //<some definitions> 
}; 
#endif 

myheader.h同時使用:

#pragma once 
#ifndef __MYHEADER_H 
#define __MYHEADER_H 
class MyClass 
{ 
    //<some definitions> 
}; 
#endif 
  • 它具有已經說過了,但是避免使用標題中的「使用」,因爲它會傳播。我自己避免在任何地方使用「使用」。
+0

非常感謝您的幫助。你應該接受這個答案。這是一個視覺工作室失敗。我從解決方案中刪除,並將.h和.cpp光盤放入光盤,並編譯成一個魅力。 –

相關問題