Я работал над кодом, похожим на следующий:
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