erlang的undefined macro 'MODULE',头一行编译通不过的问题

前言:对于erlang的编译有很多方式,rebar,makefile文件 还是对于单个文件的erlc编译等,但不管何种方式,一个模块的第一行就编译不过去,实在让人纠结...

 

1)问题上述:

在技术交流群里,有人提到头一行编译不过去,

%%%-------------------------------------------------------------------
%%% @author someone
%%% @copyright (C) 2014, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 17. 二月 2014 下午3:30
%%%-------------------------------------------------------------------
-module(dd_config).
问题是:"编译一个.erl文件时 提示undefined macro 'MODULE' 是文件第一个行 有点莫名其妙的。。"

 头一行,除了注释就是 -module(XXX). 这个了.

我当时分析了这个问题:有可能是-的不是英文而是中文的-,或者前面的空格有乱码导致的,因为已经提示是第一行:

undefined macro 'MODULE'的error导致的.

2)问题原因:

其实:这个是编辑器bom头的问题."BOM头的问题,保存的时候选择无bom头utf8格式"。可以在对应的编辑器中设置去掉bom头.

查询下何为bom头:

什么是bom头?  在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码,现在已经有很多软件识别bom头,但是还有些不能识别bom头,比如PHP就不能识别bom头,这也是用记事本编辑utf-8编码后执行就会出错的原因了。

 

关于BOM头信息

  类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。但对于 PHP来说,BOM是个大麻烦。

  PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个字符呢!

  window编辑器如果保存为utf8文件就会帮你加上BOM头,以告诉其他编辑器以utf8来显示字符

但是在网页上并不需要添加BOM头识别,因为网页上可以使用 head头 指定charset=utf8告诉浏览器用utf8来解释.但是你用window自动的编辑器,编辑,然后有显示在网页上这样就会显示出0xEF 0xBB 0xBF这3个字符。

这样网页上就需要去除0xEF 0xBB 0xBF,可以使用editplus 选择不带BOM的编码,这样就可以去除了

 

处理方案:
a)编辑器设置:

对应的编辑器下面,设置去掉bom头的设置,保存的时候选择无bom头utf8格式,对于使用的某种编辑器,如何设置不在这里做一一论述。

b) 代码检查:
我发现还可以用代码进行检查,举个例子,如下:

%%%-------------------------------------------------------------------
%%% @author abcdefg
%%% @copyright (C) 2014, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : YYYY-MM-DD
%%%-------------------------------------------------------------------
-module(dd_config).


-compile(export_all).

aa() ->
inets:start(),
{ok, {{Version, 200, ReasonPhrase}, Headers, Body}} = 
httpc:request("http://www.weather.com.cn/weather/101020100.shtml").

对于上面模块,检查它是否有bom头,可以先读模块,再检查的思路处理.

在shell下的处理如下:

  

查看unicode模块,有个函数可检查bom头,API如下:

 

  先读模块,再检查bom头, If no BOM is found, the function returns {latin1,0},说明是没有bom头的,是没问题的。

 
c)脚本检查 :
 
实现编译脚本,这样有没有bom都可以编译了。
posted @ 2014-07-17 17:14  孤独信徒  阅读(1746)  评论(0编辑  收藏  举报