如何使用const指针值初始化const结构

时间:2015-01-11 07:47:32

标签: c gcc

下面的代码无法编译,“初始化元素不是常量”,或者类似于gcc和clang。

有没有办法让z更加稳定?它已经是指向常量字符的静态常量指针。

这可以使用(以符合标准的方式)还是违反标准?

static const char * const z = "1234";
const struct {
    const char * a;
} b = {z};

我的具体用例更接近

const struct {
    char x[5];
    char y[5];
} n = {"12345","abcde"};
static const char * const z = n.x;
const struct {
    const char * a;
} b = {z};

实际上,如果我能定义一个别名,我会更高兴,就像这样

const char z[5] = n.x;

这是错误的语法,但....

3 个答案:

答案 0 :(得分:0)

这是您可以到达特定用例的最接近的地方。

#include <stdio.h>

const struct
{
    char x[6];
    char y[6];
}
    n = { "12345", "abcde" };

static const char * const z = n.x;
const struct
{
    const char * const *a;
}
    b = { &z };

int main( void )
{
    printf( "%s\n", *b.a );
}

先前声明的静态或全局对象的地址始终是编译时常量。因此,只要&z是指向指针的指针,您就可以将a分配给a

答案 1 :(得分:0)

您可以使用宏:

struct P {
  char x[5];
  char y[5];
};

#define X(_n, _z, s1, s2) \
  const struct P _n = {s1, s2}; \
  static const char _z[] = s1;

X(n, z, "12345", "abcde")

const struct 
{
  const char * a;
} b = {z};

预处理器将创建以下内容:

const struct P n = {"12345", "abcde"}; 
static const char z[] = "12345";

const struct {
  const char * a;
} b = {z};

这完全合适。

答案 2 :(得分:0)

const struct {
    char x[5];
    char y[5];
} n = {"12345","abcde"};
#define z   n.x
const struct {
    const char * a;
} b = {z};
#include <stdio.h>
int main(void)
{
    printf("%.5s == %.5s == %.5s\n", b.a, z, n.x);
}

#define符合所有规定的要求:

  • 符合C和C ++标准。
  • 这是别名,如果你想这样称呼它。
  • 它是恒定的。
  • 结构n中的数据不重复。
  • sizeof z是5。
  • 可读,易维护且便携。