编了一个程序,在一个CPP文建立就可以编译成功,如下:
#include <windows.h>
#include <stdafx.h>
#include <winsock.h>
#include <stdio.h>
#include <tchar.h>
#include <iphlpapi.h>
#include "stdafx.h"
#pragma comment(lib,"ws2_32") 
#pragma comment(lib,"iphlpapi") 
int  f()
{
    HRESULT hr;
    IPAddr  ipAddr;
    ULONG   pulMac[2];
    ULONG   ulLen;    ipAddr = inet_addr ("10.10.113.1");
    memset (pulMac, 0xff, sizeof (pulMac));
    ulLen = 6;
    
    hr = SendARP (ipAddr, 0, pulMac, &ulLen);
    printf ("Return %08x, length %8d\n", hr, ulLen);
    
    size_t i, j;
    char * szMac = new char[ulLen*3];
    PBYTE pbHexMac = (PBYTE) pulMac;    //
    // Convert the binary MAC address into human-readable
    //
    for (i = 0, j = 0; i < ulLen - 1; ++i) {
        j += sprintf (szMac + j, "%02X:", pbHexMac[i]);
    }
    
    sprintf (szMac + j, "%02X", pbHexMac[i]);
    printf ("MAC address %s\n", szMac);
    
    delete [] szMac;    return 0;
}
void main()
{
f();
}
但是如果把上面的函数声明什么都放到一个头文件里就会提示错误,如下:
#include "tool.h"
void main()
{
f();
}
h:\My Document\Visual Studio Projects\try\try.cpp(6): fatal error C1010: 在查找预编译头指令时遇到意外的文件结尾
请问这是为什么?

解决方案 »

  1.   

    你的头文件的缘故吧?
    stdafx包含了两次
    一个就行了,并且它上面最好不要包含别的投文件,它放到顶行?
    另:怎么还包含了windows.h?没时间测试,猜测的。
      

  2.   

    不好意思,那个include<stdafx.h>是后来测试时加的,去掉了还是不行,至于windows.h这个是MSDN里面的示例程序,我也不清楚:)
      

  3.   

    更奇怪的是,
    我把#include <stdafx.h>从tool.h转移到main.cpp第一行就行了,<stdafx.h>究竟是干什么的,怎么这么奇怪?
      

  4.   

    stdafx.h 是跟stdafx.cpp用来做编译优化用的,所以你只要包含一次就行,一般来说,VC在编译文件的时候会看文件的修改时间,如果没有修改过,就不会重新编译,这样可以加快编译的速度。stdafx.h里面通常也包含了一些都文件和定义什么的,你的问题在于stdafx.h里面包含过windows.h,但是你自己又包含了一次,这样不好。解决问题也可以在编译选项里面,Shift+F9,在编译部分,把预编译头文件设置成为不指定,就不会错了,以后遇到了这样问题,不想找具体原因的时候可以这么做。