я хотел бы создать const
указатель на некоторые данные в C:Inititialization из константного указателя в C
struct s {
int f;
} a = { 1 };
struct s * const c = (struct s * const)&a;
Но это светодиоды с ошибкой error: initializer element is not constant
. Я предполагаю, что это потому, что адрес не является константой компиляции, возможно ли это в некоторых случаях?
Есть const
указатели только явно назначаются? (Как void * const * x = 0xbfc0d878
)
Edit: Я apoligize для бедного описания проблемы я дал, это на самом деле работает в C. Я попытался переписать более простую версию той части, которая не работает, но это работает поэтому я думаю, что лучше всего поставить реальный код, это не так долго.
В файле protocol.h:
#define NRING 2
typedef struct entity {
char id[9]; // 8th char max, 9th is 0
char ip_self[16];
uint16_t udp;
uint16_t tcp;
char ip_next[NRING][16];
uint16_t port_next[NRING];
char mdiff_ip[NRING][16];
uint16_t mdiff_port[NRING];
} entity;
extern entity * const ent;
В файле protocol.c:
entity _ent_;
entity * const ent = (entity * const)&_ent_;
В файле _protocol_interface.h_:
#include "protocol.h"
typedef struct info_t {
const char id[9];
const char ip_self[16];
const uint16_t udp;
const uint16_t tcp;
const char ip_next[NRING][16];
const uint16_t port_next[NRING];
const char mdiff_ip[NRING][16];
const uint16_t mdiff_port[NRING];
} info_t;
extern info_t * const info;
В файле _protocol_interface .c_:
info_t * const info = (info_t * const)ent;
Ошибка приходят из _protocol_interface.c_:
error: initializer element is not constant
info_t * const info = (info_t * const)ent;
Edit2: Это работает:
info_t * const info = (info_t * const)&_ent_; // _ent_ is of type entity
Хотя это не
info_t * const info = (info_t * const)ent; // ent is of type entity * const
пожалуйста, обратитесь к https://stackoverflow.com/questions/1143262/what-is-the-difference-between-const-int-const-int-const-and-int-const –
пожалуйста, не» t ненужно пометить вопросы C как C++. – Brian
на самом деле компилируется как C, но не работает, как C++ – pm100