programing

C의 파일 범위에서 가변적으로 변경된 어레이

coolbiz 2022. 7. 7. 23:46
반응형

C의 파일 범위에서 가변적으로 변경된 어레이

다음과 같은 코드가 있습니다.

static int a = 6;
static int b = 3;

static int Hello[a][b] =
{
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3}
};

컴파일 할 때 에러라고 표시됩니다.

파일 범위에서 가변적으로 수정된 'Hello'

어떻게 이런 일이 일어날 수 있을까요? 그리고 어떻게 고칠 수 있을까요?

변수로 지정된 크기를 정적 배열로 지정할 수 없습니다.

그렇기 때문에 상수는#defined:

#define a 6

이렇게 하면 프리프로세서가 교체됩니다.a와 함께6유효한 선언이 됩니다.

CLANG/LLVM을 사용하는 경우 다음과 같이 동작합니다.

static const int a = 6;
static const int b = 3;

static int Hello[a][b] =
{
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3}
}; 

(생성된 어셈블리에서 보려면 Hello를 사용해야 하므로 최적화되지 않습니다.)

그러나 C99 모드를 선택하면 오류가 발생하고(-std=c99), -pedantic을 선택하면 경고(Wgnu-folding-constant)만 생성됩니다.

GCC가 이를 허용하지 않는 것 같습니다(const는 읽기 전용으로 해석됩니다).

이 스레드의 설명을 참조해 주세요.

Linux GCC에서 이유 없이 "Initializer element is not constant" 오류가 발생하여 C를 컴파일합니다.

네, 이건 어닝입니다.

const int len = 10;

int stuff[len];

에러를 표시합니다.const int가 상수를 선언하는 더 좋은 방법이기 때문에 #define x에서 벗어나려고 합니다.그러나 const int가 진정한 상수가 아님을 컴파일러가 충분히 알고 있음에도 불구하고 const int가 진정한 상수가 아닌 경우가 있습니다.

간단한 답변variable modified array at file scope is not possible.

상세:

컴파일 시간을 만들다integral constant expression컴파일 시 어레이 길이를 지정해야 하기 때문입니다.

다음과 같습니다.

#define a 6
#define b 3

또는 c99 standard에 따라 gcc와 같이 컴파일 합니다.

gcc -Wall -std=c99 test.c -o test.out

여기서의 문제는 길이를 지정하는 가변 길이 배열이 초기화되지 않을 수 있기 때문에 이 오류가 발생한다는 것입니다.

단순하게

static int a =6;
static int b =3;

void any_func()
{
int Hello [a][b]; // no need of initialization no static array means no file scope.
}

이제 루프 또는 임의의 루프를 사용하여 어레이를 채웁니다.

상세한 것에 대하여는, DEMO를 참조하십시오.

#include <stdio.h>
static int a = 6; 
int main()
{
int Hello[a]={1,2,3,4,5,6}; // see here initialization of array Hello it's in function
                            //scope but still error
return 0;
}


root@Omkant:~/c# clang -std=c99 vararr.c -o vararr
vararr.c:8:11: error: variable-sized object may not be initialized
int Hello[a]={1,2,3,4,5,6};
          ^
1 error generated. 

스태틱을 삭제하고 초기화를 실시하면 위와 같은 에러가 발생합니다.

그러나 초기화와 정적인 상태를 유지하면 여전히 오류가 발생합니다.

하지만 초기화를 제거하고static아래 오류가 발생합니다.

error: variable length array declaration not allowed at file scope
static int Hello[a];
           ^     ~
1 error generated.

따라서 가변 길이 배열 선언은 파일 범위에서는 허용되지 않으므로 함수 내에서 기능 또는 블록 범위를 설정합니다(단, 함수 범위에서는 초기화를 삭제해야 합니다).

메모: 이 값은C태그가 달린 메이킹a그리고.b~하듯이const너를 돕지 않겠지만C++ const정상적으로 동작합니다.

언급URL : https://stackoverflow.com/questions/13645936/variably-modified-array-at-file-scope-in-c

반응형