我在以下程序的第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;
}
Run Code Online (Sandbox Code Playgroud)
请记住,这是我正在研究的大型多文件项目的简化版本.目标是在目标文件中有一个常量,多个文件可用于初始化状态结构.由于它是一个资源有限的嵌入式目标,并且结构不是那么小,我不想要源的多个副本.我不想使用:
#define foo_init { 1, 2, 3 }
Run Code Online (Sandbox Code Playgroud)
我也在尝试编写可移植代码,所以我需要一个有效的C89或C99解决方案.
这是否与目标文件中的ORG有关?初始化变量进入一个ORG并通过复制第二个ORG的内容进行初始化?
也许我只需要改变我的策略,并在启动时使用初始化功能完成所有副本.除非有其他想法吗?
我有一些像这样的代码:
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}
};
Run Code Online (Sandbox Code Playgroud)
但是当我编译它时,它说错误:
在文件范围内可变地修改了"Hello"
怎么会发生这种情况?我该怎么办呢?
我正在尝试编写一个结构来计算基类和派生类之间的指针偏移量,作为C++ 03中的常量表达式.代码如下:
template <typename Base, typename Derived, typename Via = Derived>
struct OffsetToBase
{
static const std::ptrdiff_t val =
(const char*const)static_cast<Base*const>(static_cast<Via*const>((Derived*const)(1u << 7))) -
(const char*const)(1u << 7);
};
Run Code Online (Sandbox Code Playgroud)
代码在GCC中编译,但不在clang和VC中编译.clang和VC产生的错误基本上表明初始化器不是一个常量表达式,clang进一步强调了子表达式(Derived*const)(1u << 7).
所以,我的问题是标准对此有何看法?如果初始化程序根据标准不符合常量表达式,那么这背后的原因是什么?
更新: 为了您的兴趣,我发现了以下两个讨论:
"初始化器元素不是常量"错误在Linux GCC中没有任何理由,编译C
但我不认为相同的规则适用于C++.