我在下面程序的第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;
}
请记住,这是我正在处理的一个更大的多文件项目的简化版本。目标是在目标文件中有一个常量,多个文件可以用来初始化一个状态结构。由于它是一个资源有限的嵌入式目标,而struct又没有那么小,所以我不想要源代码的多个副本。我不喜欢使用:
#define foo_init { 1, 2, 3 }
我还在尝试编写可移植的代码,因此我需要一个有效的C89或C99解决方案。
这是否与对象文件中的组织有关?初始化的变量进入一个ORG,并通过复制第二个ORG的内容进行初始化?
也许我只需要改变我的策略,让一个初始化函数在启动时完成所有的拷贝。除非有其他的想法?
发布于 2015-12-10 10:29:42
这有点老了,但我遇到了类似的问题。如果使用指针,则可以执行此操作:
#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;
}
发布于 2020-01-14 22:32:11
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:错误:初始化器元素不是常量const char * str2 = str1;
事实上,"const char *“字符串不是编译时常量,所以它不能是初始化器。但是"const char * const“字符串是一个编译时常量,它应该能够成为一个初始化器。我认为这是CLang的一个小缺点。
函数名当然是编译时的constant.So,这段代码是这样工作的:
void func(void)
{
printf("func\n");
}
typedef void (*func_type)(void);
func_type f = func;
int main() {
f();
return 0;
}
发布于 2021-01-01 02:51:09
我在代码中有这个错误,看起来像这样:
int A = 1;
int B = A;
修复方法是将其更改为以下内容
int A = 1;
#define B A
编译器将内存中的位置分配给变量。第二个是尝试将第二个变量赋给与第一个变量相同的位置-这是没有意义的。使用宏预处理器解决了这个问题。
https://stackoverflow.com/questions/3025050
复制相似问题