1. 云栖社区>
  2. PHP教程>
  3. 正文

记录一次erlang的undefined macro 'MODULE'问题 - 光阴的故事2012

作者:用户 来源:互联网 时间:2017-12-01 12:47:33

记录

记录一次erlang的undefined macro 'MODULE'问题 - 光阴的故事2012 - 摘要: 本文讲的是记录一次erlang的undefined macro 'MODULE'问题 - 光阴的故事2012, 1)问题上述: 在技术交流群里,有人提到头一行编译不过去, %%%-------------------------------------------------------------------%%% @author someone

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的编码,这样就可以去除了


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

%%%-------------------------------------------------------------------

%%% @author abcdefg

%%% @copyright (C) 2014, <COMPANY>

%%% @doc

%%%

%%% @end

%%% Created : YYYY-MM-DD

%%%-------------------------------------------------------------------

-module(dd_config).

aa() ->

inets:start(),

{ok, {{Version, 200, ReasonPhrase}, Headers, Body}} = 

httpc:request("http://www.weather.com.cn/weather/101020100.shtml").

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

结果如下:

记录一次erlang的undefined macro 'MODULE'问题 - 光阴的故事2012

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

记录一次erlang的undefined macro 'MODULE'问题 - 光阴的故事2012

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

扩展:实现编译脚本,这样有没有bom都可以编译了。

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索记录 ,以便于您获取更多的相关知识。