为何不包含头文件可以使用另一个文件中的函数但是变量不可以

为什么不包含头文件可以使用另一个文件中的函数但是变量不可以
文件a.h中

int mym ;
int foo(int a);


文件a.cpp中

#include "stdafx.h"
int foo(int a)
{
return 0;
}


文件b.cpp中

#include "stdafx.h"
extern int mym;
extern int foo(int a);
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  mym = 5; //报错,加上include "a.h"可以链接通过
  foo(5);  //
  return 0;
}

为什么没有include "a.h",在另外一个文件中可以用foo,却不能用mym
全局变量和函数是不同的吗
------解决方案--------------------
不#include "a.h", a.cpp又没有定义int mym;
------解决方案--------------------
int foo(int a);只是是声明
int mym ;   是声明,也是定义
------解决方案--------------------
不包含a.h,则mym只有声明,没有定义(mym是在.h中定义的,这很奇怪,如果.h多次包含,会出现重复定义)

但是对于函数,如果没有声明,老的实现是假定它是返回int的函数,现在的实现对此有一定的兼容性

对新的语法来说,函数不声明就使用,是语法错误。

------解决方案--------------------
你真正的错误是直接在a.h定义了变量,而不仅仅是声明。
当你有两个源文件都包含了a.h你就会遇到变量重定义错误。

函数声明(不包含函数体的)没有extern也是外部的,因为没有函数体,无论如何都不能成为一个定义。
变量必须加上extern才是外部的,也就是一个声明而非定义。