• 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都可以编译了。
  • 相关阅读:
    日本处方药物
    oqtane 与 OrchardCore 两个快速Blazor框架
    Radzen 一个快速开发Net Core BLazor 框架,代替 Lightswitch,含 Free组件
    IBM罗睿兰CEO任期内给全球投资者的最后一封信(转)
    serenity 开发框架(Net Core 2.2 C#)
    商务成本一体化管理系统(施工企业)--> 个性定制标准化流程管理系统 ---- 土木众联
    一站式招采管理系统(施工企业)---- 土木众联
    资信证件数字化管理系统(施工企业)---- 土木众联公司
    API 测试工具 --- 图形化界面
    014_浅说 XSS和CSRF
  • 原文地址:https://www.cnblogs.com/unqiang/p/3851562.html
Copyright © 2020-2023  润新知