Работя върху някакъв код, който е подобен на следния:
typedef struct
{
unsigned char x;
unsigned short y;
unsigned char[NUM_DEFINED_ELSEWHERE];
} My_Struct;
static My_Struct my_useful_struct; // Variables initialized elsewhere in code.
void myFunction(const My_Struct * p_my_struct)
{
/* Performs various read-only actions utilizing p_my_struct. */
}
void myOtherFunction(void)
{
static My_Struct * p_struct = &my_useful_struct;
myFunction(p_struct);
}
Моят код се компилира без никакви проблеми, но при прегледа ми беше казано, че освен ако не преобразувам p_struct, това може да доведе до недефинирано поведение на определени платформи (т.е. 8051). Въпреки това никога не съм получавал предупреждение на компилатора. Вярно ли е, че непреобразуването на указателя при предаването му на функцията с (const My_Struct *)
може да доведе до недефинирано поведение?
Причината, поради която декларирах горната функция с указател към const
, беше, че исках да мога да работя както с указател към const, така и с указател. Лоша практика на кодиране ли е да не се въвежда в горната ситуация?
Благодаря за вашата помощ!
static My_Struct p_struct = &my_useful_struct;
е незаконен. Само указателите могат да получат адреса на нещо... - person Basile Starynkevitch   schedule 25.02.2012myOtherFunction()
- вероятно искатеp_struct
да бъде указател и да премахнете&
от следното извикване... - person Christoph   schedule 25.02.2012&
не е в името на типа, той е в инициализацията и следователно добрия стар оператор за адрес на. - person   schedule 25.02.2012**
на функция, очакваща*
- person Christoph   schedule 25.02.2012T *
е имплицитно конвертируем вT const *
, така че няма нужда от преобразуване (и това наистина е напълно логично). - person Kerrek SB   schedule 25.02.2012