오류 : X는이 함수에서 C에서 이기식으로 사용되지 않을 수 있습니다.

StackOverflow https://stackoverflow.com/questions/628410

  •  06-07-2019
  •  | 
  •  

문제

이 오류가 발생합니다

error: Access.Core may be used uninitialized in this function

그리고 이것은 내 코드입니다.

 static int FirstTime = 1;
 MyStruct Access;

 if (FirstTime) {
   FirstTime = 0;
   Access = Implementation();
   DoSomething(Access);
 }

 if(Other_Variable) {
    Access = Implementation2();
    DoSomething(Access);
  }

  //The Other_Variable will be set to 1 and to 0 by other part of the code

내 코드는 처음으로 만 함수 구현에 호출하고 싶기 때문에 그와 같습니다. 모든 통화에서 액세스 변수가 업데이트되므로 많은 의미가 없어서 정적으로 만들지 않습니다.

액세스 정적 작업을 수행하면 다른 모든 통화 액세스가 업데이트되기 때문에 정적으로 만드는 것을 좋아하지 않습니다. 문제를 정적으로 만들지 않고 피하는 방법은?.

또한 정적 변수를 사용하는 대신 한 번만 함수를 실행하는 더 나은 옵션을 환영합니다.

도움이 되었습니까?

해결책

만들다 Access 이렇게 (그리고 제거하십시오 FirstTime 그리고 if):

static MyStruct Access = Implementation(this_b);

이 경고를받는 이유는 정적 변수가 하나의 함수 호출에서 살아 남기 때문입니다. 그들의 가치는 모든 기능 호출에 걸쳐 유지됩니다 (없이 어떤 스레드가 해당 함수를 호출하는지 고려). 그래서, FirstTime 초기화 여부를 제어합니다 Access. 코드가있는 함수를 처음 호출하면 Access 변하기 쉬운. 그러나 모든 기능 호출마다 FirstTime 제로이고 당신은 할 것입니다 ~ 아니다 초기화 Access 더 이상, 따라서 코드 아래로 초기화되지 않은 변수를 사용합니다.

편집하다: 이제 업데이트 된 정보를 사용하면 두 가지가 있다고 말합니다. Implementation 기능. 처음으로 하나를 사용하고 싶을 때, 다른 시간은 다른 기능을 사용하려고합니다. 그때는 어때요 :

 // static will be false/zero by default
 static bool AlreadyCalled;
 MyStruct Access;

 if (!AlreadyCalled) {
   Access = Implementation();
   AlreadyCalled = true;
 } else {
   Access = Implementation2();
 }

실제 사용 사례에 따라이를 처리하는 더 나은 방법이있을 수 있습니다. 예를 들어, 상태를 업데이트하지 않는 이유는 무엇입니까? Access, 이와 같이:

// let the default constructor initialize it
// to a plausible state
static MyStruct Access;

// use RAII to update the state of Access when this
// function returns. 
MyUpdater updater(Access);

// now, do whatever the function does. 

이런 것 MyUpdater:

struct MyUpdater {
    MyStruct &s;
    MyUpdater(MyStruct &s):s(s) { }
    ~MyUpdater() {
        s.ChangeState();
    }
};

그 패턴이 호출됩니다 RAII: 당신은 유용한 조치를 로컬로 할당 된 물체의 생성자 및 소멸자와 연관시킵니다.

다른 팁

@litb의 대답은 흥미 롭습니다. 동등한 프로그램이 따릅니다. 코드는 C ++에 명시된대로 컴파일하고 작동하지만 C에서는 컴파일하지 않습니다.

#include <stdio.h>

static int newval(void) { return 3; }

void inc(void)
{
    static int a = newval();

    a++;
    printf("%d\n", a);
}

int main(void)
{
    int i;
    for (i = 0; i < 10; i++)
        inc();
    return(0);
}

GCC 말 :

XC : Function 'Inc': XC : 7 : 오류 : 이니셜 라이저 요소가 일정하지 않습니다.

G ++는 그것에 매우 만족합니다.

그것은 내가 알지 못하는 C와 C ++의 차이입니다 (그러나 이것은 300 자에 맞지 않기 때문에 쉽게 의견을 제시 할 수 없습니다).


@eduardo는 다음과 같은 질문 중 하나를 물었습니다. "C는 왜이를 허용하지 않고 C ++가 허용합니까?" 대답은 300 자 이상이므로 ...

@litb가 의견에서 말했듯이 C에서는 정적 변수의 초기화에 상수 만 사용할 수 있습니다. 이것은 부분적으로 main ()가 호출되기 전에 설정되며 main ()가 호출되기 전에 사용자 정의 함수가 호출되지 않기 때문입니다. 대조적으로 C ++는 main ()이 호출되기 전에 (사용자 정의) 생성자로 글로벌 및 정적 변수를 초기화 할 수 있으므로 다른 사용자 정의 함수도 호출 할 수 없으므로 초기화가 합리적입니다. C89를 사용하면 자동 (로컬) 변수와 함께 사용할 수있는 초기화기가 제한됩니다. C99에서는 거의 모든 표현식을 사용하여 로컬 변수를 초기화 할 수 있습니다.

액세스는 정적이 아니므로 함수를 호출 할 때마다 새 인스턴스가 생성됩니다. 처음으로 만 값을 실제로 할당합니까? 이 값은 함수가 종료되는 즉시 손실됩니다.

기능에 대한 통화를 통해 지속에 대한 액세스가 필요한 경우 정적으로 만드십시오.

Access 정적이 아니므로 모든 호출에서 생성되어야합니다.

코드를 다음과 같은 것들로 단순화하는 것을 고려하십시오.

static MyStruct Access = Implementation(this_b);

이렇게하면 메소드가 처음 실행될 때만 기능이 Access 통화 사이의 값을 보유합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top