const를 사용하여 변수를 초기화하려고 할 때 "initializer element is not const" 오류가 발생함
다음 프로그램의 6번째 줄(my_foo를 foo_init으로 초기화)에 오류가 발생하는데 그 이유를 알 수 없습니다.
typedef struct foo_t {
int a, b, c;
} foo_t;
const foo_t foo_init = { 1, 2, 3 };
foo_t my_foo = foo_init;
int main()
{
return 0;
}
이것은 제가 작업 중인 대형 다중 파일 프로젝트의 단순화된 버전입니다.목표는 오브젝트 파일에 여러 파일이 상태 구조를 초기화하기 위해 사용할 수 있는 단일 상수를 갖는 것이었습니다.리소스가 제한된 임베디드 타깃이고 구조가 작지 않기 때문에 소스 복사본을 여러 개 복사하고 싶지 않습니다.다음을 사용하지 않는 것이 좋습니다.
#define foo_init { 1, 2, 3 }
휴대용 코드도 작성하려고 하는데, C89나 C99가 유효한 솔루션이 필요합니다.
오브젝트 파일의 ORG와 관련이 있습니까?초기화된 변수가 하나의 조직으로 들어가 두 번째 조직 내용을 복사함으로써 초기화되는 건가요?
기동시에 모든 카피를 초기화 기능에 의해서, 전술의 변경만 있으면 되는 경우도 있습니다.다른 아이디어가 없다면?
C 언어에서 정적 저장 기간이 있는 개체는 상수 표현식 또는 상수 표현을 포함하는 집계 이니셜라이저를 사용하여 초기화해야 합니다.
"큰" 개체는 다음과 같이 선언되어도 C에서 상수 표현식이 아닙니다.const
.
게다가, C 언어에서, "상수"라는 용어는 문자 그대로의 상수(예:1
,'a'
,0xFF
등), 열거 멤버 및 다음과 같은 연산자의 결과sizeof
const-qualified objects (모든 유형의)는 C언어 용어의 상수가 아닙니다.유형에 관계없이 저장 기간이 정적인 개체의 이니셜라이저에 사용할 수 없습니다.
예를 들어, 이것은 상수가 아닙니다.
const int N = 5; /* `N` is not a constant in C */
상기의N
C++에서는 상수가 되지만 C에서는 상수가 아닙니다.그래서, 만약 당신이 그것을 하려고 한다면
static int j = N; /* ERROR */
같은 에러가 발생합니다.즉, 스태틱오브젝트를 비패킷으로 초기화하려고 합니다.
이것이 C 언어에서 우리가 주로 사용하는 이유이다.#define
명명된 상수를 선언하는 것, 그리고 또한 의지하는 것#define
이름 있는 집약 이니셜라이저를 만듭니다.
언어의 한계입니다.섹션 6.7.8/4에서:
정적 저장 기간이 있는 객체의 이니셜라이저 표현식은 모두 상수 표현식 또는 문자열 리터럴이어야 합니다.
섹션 6.6에서, 규격은 상수식으로 간주되어야 하는 것을 정의합니다.아니요. 여기에는 상수 변수를 상수식으로 간주해야 한다고 명시되어 있습니다.입니다.6.6/10 - An implementation may accept other forms of constant expressions
이이 제한됩니다. 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.
수 my_foo
정적 스토리지가 없기 때문에 문제 없습니다.
int main()
{
foo_t my_foo = foo_init;
return 0;
}
:에 이 :arm-none-eabi-gcc.exe
STM32 MCU:
을 툴음음음음음음음음음음으로 변경하다gnu-tools-for-stm32.9-2020-q2-update
.
GCC V8.1+부터는 네스트된 상수 이니셜라이저가 지원되며 다음 코드가 컴파일됩니다.
const int a = 1;
const int b = a +1;
typedef struct foo_t {
int a, b, c;
} foo_t;
const foo_t foo_init = { 1, 2, 3 };
foo_t my_foo = foo_init;
int main()
{
return 0;
}
arm-none-eabi-gcc.exe
gnu-tools-for-stm32.7-2018-q2-update
으로 하고 있습니다.gcc v7.3.1
!!코!!!!!!!!!!!!!! ★★★★★★★★★★★★★★★★★.gnu-tools-for-stm32.9-2020-q2-update
gcc v9.3.1
파일합합니니다
상세한 것에 대하여는, 다음을 참조해 주세요.
'이니셜라이저'가 작동하지 더이 ?안 ???
...
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69960#c18httpsgcc.gnu.org//show_bug.cgi?id=69960#c18
비교와 콘트라스트에 의한 설명만을 위해 코드는 http://www.geeksforgeeks.org/g-fact-80/ / 코드는 gcc에서 실패하고 g++/로 전달됩니다.
#include<stdio.h>
int initializer(void)
{
return 50;
}
int main()
{
int j;
for (j=0;j<10;j++)
{
static int i = initializer();
/*The variable i is only initialized to one*/
printf(" value of i = %d ", i);
i++;
}
return 0;
}
이것은 조금 오래된 것이지만, 비슷한 문제에 부딪혔습니다.포인터를 사용하면 다음과 같이 할 수 있습니다.
#include <stdio.h>
typedef struct foo_t {
int a; int b; int c;
} foo_t;
static const foo_t s_FooInit = { .a=1, .b=2, .c=3 };
// or a pointer
static const foo_t *const s_pFooInit = (&(const foo_t){ .a=2, .b=4, .c=6 });
int main (int argc, char **argv) {
const foo_t *const f1 = &s_FooInit;
const foo_t *const f2 = s_pFooInit;
printf("Foo1 = %d, %d, %d\n", f1->a, f1->b, f1->c);
printf("Foo2 = %d, %d, %d\n", f2->a, f2->b, f2->c);
return 0;
}
gcc 7.4.0은 다음과 같은 코드를 컴파일할 수 없습니다.
#include <stdio.h>
const char * const str1 = "str1";
const char * str2 = str1;
int main() {
printf("%s - %s\n", str1, str2);
return 0;
}
constchar.c:3:21: 오류: initializer 요소가 상수 const char * str2 = str1이 아닙니다.
실제로 "const char *" 문자열은 컴파일 시간 상수가 아니므로 이니셜라이저일 수 없습니다.그러나 "const char * const" 문자열은 컴파일 시간 상수이므로 이니셜라이저일 수 있습니다.이게 CLANG의 작은 단점이라고 생각합니다.
함수 이름은 물론 컴파일 시간 상수입니다.이 코드는 다음과 같이 동작합니다.
void func(void)
{
printf("func\n");
}
typedef void (*func_type)(void);
func_type f = func;
int main() {
f();
return 0;
}
코드에는 다음과 같은 오류가 있습니다.
int A = 1;
int B = A;
수정은 이것으로 변경하는 것입니다.
int A = 1;
#define B A
컴파일러는 메모리 내의 위치를 변수에 할당합니다.두 번째는 두 번째 변수를 첫 번째 변수와 동일한 위치에 할당하려고 시도하는 것입니다. 이는 의미가 없습니다.매크로 프리프로세서를 사용하면 문제가 해결됩니다.
언급URL : https://stackoverflow.com/questions/3025050/error-initializer-element-is-not-constant-when-trying-to-initialize-variable-w
'programing' 카테고리의 다른 글
Vuex의 동적 변경 값 감시 (0) | 2022.07.04 |
---|---|
Vue.js 이거 봐.$el.getContext('2d')는 함수가 아닙니다. (0) | 2022.07.04 |
Vuetify 콤보 상자 항목 템플릿이 vuex로 업데이트되지 않음 (0) | 2022.07.04 |
Vue 3 SSR 앱에서 라우터의 vuex 스토어를 사용하려면 어떻게 해야 합니까? (0) | 2022.07.04 |
R_X86_64_32S 및 R_X86_64_64 재배치란 무엇입니까? (0) | 2022.07.04 |