下面的代码无法编译,“初始化元素不是常量”,或者类似于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;
这是错误的语法,但....
答案 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
符合所有规定的要求:
n
中的数据不重复。sizeof z
是5。