Lua ver1.빌드 1 오류
개시하다
예전에 다음과 같은 기사를 썼습니다.
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)
나는 이렇게 하면 번역할 수 있을 것이라고 생각했는데, 결과가 잘못되었다.
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
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.5clients/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를 사용해도 나타나지 않습니다.
Reference
이 문제에 관하여(Lua ver1.빌드 1 오류), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/saitoyutaka/articles/94b3c8e56b4d67텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)