Lua ver1.빌드 1 오류

15390 단어 LuaGCCC 언어tech

개시하다


예전에 다음과 같은 기사를 썼습니다.
https://zenn.dev/saitoyutaka/articles/4618aa762247d5 clients/lib/iolib.c의 파일을 다음과 같이 수정하였다.
diff --git a/clients/lib/iolib.c b/clients/lib/iolib.c
index b972124..ec2ef3c 100644
--- a/clients/lib/iolib.c
+++ b/clients/lib/iolib.c
@@ -11,14 +11,19 @@ char *rcs_iolib="$Id: iolib.c,v 1.4 1994/04/25 20:11:23 celes Exp $";
 #include <ctype.h>
 #include <sys/stat.h>
 #ifdef __GNUC__
-#include <floatingpoint.h>
+// #include <floatingpoint.h>
 #endif
 
 #include "mm.h"
 
 #include "lua.h"
 
-static FILE *in=stdin, *out=stdout;
+// static FILE *in=stdin, *out=stdout;
+static FILE *in, *out;
+
+ __attribute__((constructor)) void initHw(void){
+  in=stdin, out=stdout;
+}
우리는 이 수정의 아래 부분을 조사했다.
static FILE *in=stdin, *out=stdout;

수정하지 않는 동안 발생한 오류(initializer element is not constant)


clients/lib/iolib.c
static FILE *in=stdin, *out=stdout;
위에서 설명한 대로 다음 오류가 생성됩니다.
In file included from iolib.c:10:
iolib.c:21:17: error: initializer element is not constant
   21 | static FILE *in=stdin, *out=stdout;
      |                 ^~~~~
iolib.c:21:29: error: initializer element is not constant
   21 | static FILE *in=stdin, *out=stdout;
      |                             ^~~~~~
Lua Ver1.1 방출될 때의 컴파일러그러면
이렇게 번역하면 완성되는 거죠.
https://godbolt.org/페이지
나는 가장 오래된 버전의 gcc로 확인했다.
(x86-64 gcc 4.1.2)
나는 이렇게 하면 번역할 수 있을 것이라고 생각했는데, 결과가 잘못되었다.
https://godbolt.org/z/75Yn9a8ea
Lua 1.1 was released on 08 Jul 1994
왜냐하면 아마도 당시에 사용했던 gcc의 버전은
한 2.4 정도 되는 것 같아요.http://ftp.tsukuba.wide.ad.jp/software/gcc/old-releases/gcc-2/gcc-2.4.5.tar.bz2의 변경 로그는 다음과 같습니다.
Sat Jun 19 03:57:57 1993 Richard Stallman
  • Version 2.4.4 released.
  • 근데 이 버전도 initializer element is not constant의...
    잘못된 구조로 보인다.
    c-typeck.c
    tree
    digest_init (type, init, tail, require_constant, constructor_constant, ofwhat)
         tree type, init, *tail;
         int require_constant, constructor_constant;
         char *ofwhat;
    {
    // 省略
    
      /* Any type except an array can be initialized
         from an expression of the same type, optionally with braces.
         For an array, this is allowed only for a string constant.  */
    
      if (inside_init && TREE_TYPE (inside_init) != 0
          && ((TYPE_MAIN_VARIANT (TREE_TYPE (inside_init))
    	   == TYPE_MAIN_VARIANT (type))
    	  || (code == ARRAY_TYPE
    	      && comptypes (TREE_TYPE (inside_init), type))
    	  || (code == POINTER_TYPE
    	      && (TREE_CODE (TREE_TYPE (inside_init)) == ARRAY_TYPE
    		  || TREE_CODE (TREE_TYPE (inside_init)) == FUNCTION_TYPE)
    	      && comptypes (TREE_TYPE (TREE_TYPE (inside_init)),
    			    TREE_TYPE (type)))))
        {
    // 省略
    
          if (require_constant && ! TREE_CONSTANT (inside_init))
    	{
    	  error_init ("initializer element%s is not constant",
    		      " for `%s'", ofwhat);
    	  inside_init = error_mark_node;
    	}
          else if (require_constant
    	       && initializer_constant_valid_p (inside_init, TREE_TYPE (inside_init)) == 0)
    	{
    	  error_init ("initializer element%s is not computable at load time",
    		      " for `%s'", ofwhat);
    	  inside_init = error_mark_node;
    	}
    
          return inside_init;
        }
    

    Lua Ver2.4 -> Ver2.5


    Lua의 각 버전 코드를 보고 Ver2를 발견했습니다.5에는 다음과 같은 변화가 있다.
    Ver2.4
    clients/lib/iolib.c
    #include "lua.h"
    #include "luadebug.h"
    #include "lualib.h"
    
    static FILE *in=stdin, *out=stdout;
    
    Ver2.5
    clients/lib/iolib.c
    #include "lua.h"
    #include "luadebug.h"
    #include "lualib.h"
    
    FILE *lua_infile, *lua_outfile;
    //省略
    void iolib_open (void)
    {
      lua_infile=stdin; lua_outfile=stdout;
      luaI_openlib(iolib, (sizeof(iolib)/sizeof(iolib[0])));
      lua_setfallback("error", errorfb);
    }
    
    HISTORY 파일을 보면 다음과 같은 기록이 있다.
    HISTORY
    Current version is 2.5
    
    * Changes since version 2.4
      + io and string libraries are now based on pattern matching;
        the old libraries are still available for compatibility
      + dofile and dostring can now return values (via return statement)
      + better support for 16- and 64-bit machines
      + expanded documentation, with more examples
    

    총결산

    initializer element is not constant 오류가 이전 환경에서 발생했는지 여부
    몰라요.
    네, 알겠습니다.
    Lua Ver2.5 중 initializer element is not constant의 오류는 최신 gcc를 사용해도 나타나지 않습니다.

    좋은 웹페이지 즐겨찾기