2016-04-25 2 views
0

я хотел бы создать 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 
+1

пожалуйста, обратитесь к https://stackoverflow.com/questions/1143262/what-is-the-difference-between-const-int-const-int-const-and-int-const –

+3

пожалуйста, не» t ненужно пометить вопросы C как C++. – Brian

+1

на самом деле компилируется как C, но не работает, как C++ – pm100

ответ

-1

компилируется

#include <iostream> 
using namespace std; 
struct s { 
    int f; 
} a = { 1 }; 

struct s const * c = &a; 
int main() { 
    // your code goes here 
    return 0; 
} 
+0

Скомпилирует, но уже не то, что было предложено: теперь это неконстантный указатель на структуру const. -1 –

+0

Я знаю - но это показывает, что вы можете иметь константы, которые включают адреса времени, разрешенные по времени, - это интересно, и это указывает на то, где проблема. По крайней мере, я получил плакат на полпути к ответу – pm100

Смежные вопросы