相关疑难解决方法(0)

静态结构初始化线程安全

给出以下示例:

struct test
{
    const char* data;
    const int number;
};

struct test* foo()
{
    static struct test t = {
        "this is some data",
        69
    };
    return &t;
}
Run Code Online (Sandbox Code Playgroud)

对线程的调用是foo安全的吗?换句话说,该结构是否仅以线程安全的方式初始化一次?如果用 C 或 C++ 编译它有什么区别吗?

c c++ static thread-safety

7
推荐指数
1
解决办法
469
查看次数

为什么"初始化元素不是常数"是......不再工作了?

static const int a = 42;
static const int b = a;
Run Code Online (Sandbox Code Playgroud)

我希望在这样的代码中出现编译错误.初始值设定项必须是常量表达式或字符串文字.存储在int具有const类型限定符类型的对象中的值不是常量表达式.

我编译-Wall -Wextra -pedantic,甚至与-ansi.然后:

令人惊讶的是,以下内容:

static const char * const a = "a";
static const char * const b = a;
Run Code Online (Sandbox Code Playgroud)

c gcc language-lawyer constant-expression

5
推荐指数
1
解决办法
430
查看次数

初始化元素不是常量

我想创建向量表来为 MCU 创建启动代码,当我尝试将函数地址放入向量表时,编译器会产生错误:initialiser element is not constant

void reset_handler(void);

uint32_t const vector_table[] = {
    STACK_START,
    (uint32_t)&reset_handler
};

void rest_handler(void)
{
}
Run Code Online (Sandbox Code Playgroud)

我总是使用函数指针类型来创建函数数组,但是这次我想知道为什么当我使用uint32_t类型数组时我不能将函数的地址放入其中

c embedded initialization constants

5
推荐指数
1
解决办法
139
查看次数

为什么 GCC/Clang 会接受 const 限定对象作为具有静态存储持续时间的对象的初始值设定项?

据我所知,ISO C 标准对 C11 6.7.9 中具有静态存储持续时间的对象的初始值设定项很严格

具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字。

但是 GCC/Clang 都接受了以下代码:

const int i = 3; // const here should not make i a constant expression
static int j = i;
Run Code Online (Sandbox Code Playgroud)

即使有-Wall -Wextra -Werror -pedantic-errors,上面的编译器也没有给我任何抱怨。

但是,这些编译器确实意识到这i不是一个常量表达式。例如,Clang 给了我:

错误:静态数组的大小必须是整数常量表达式

对于以下代码:

const size_t sz = 3;
static int a[sz];
Run Code Online (Sandbox Code Playgroud)

我在这里有什么问题吗?

c static constants

1
推荐指数
1
解决办法
71
查看次数