Проблема при назначении указателя на переменную перечисления в C - PullRequest
2 голосов
/ 20 декабря 2010

Я получаю предупреждение о "присвоении из несовместимого типа указателя". Я не понимаю, почему происходит это предупреждение. Я не знаю, что еще объявить переменную "the_go_status", отличную от целого числа. (Примечание: это не весь код, а просто упрощенная версия, которую я разместил для иллюстрации проблемы.)

Предупреждение появляется в последней строке примера, который я включил ниже.

//In a header file  
enum error_type  
{  
    ERR_1 = 0,  
    ERR_2 = 1,  
    ERR_3 = 2,  
    ERR_4 = 4,  
};  


//In a header file  
struct error_struct  
{  
   int value;  
   enum error_type *status;  
};  



//In a C file  
int the_go_status;  

the_go_status = ERR_1;  

//Have the error_struct "status" point to the address of "the_go_status"  
error_struct.status = &the_go_status;    //WARNING HERE!

Ответы [ 6 ]

3 голосов
/ 20 декабря 2010

Потому что status - это указатель на enum error_type, а the_go_status - указатель на int. Они являются указателями на разные типы.

2 голосов
/ 20 декабря 2010

Это потому, что enum error_type * несовместимо с int *, потому что они указывают на значения разных типов (и, возможно, даже разных размеров).Вы должны объявить the_go_status как:

enum error_type the_go_status;

Хотя простое приведение указателя (т. Е. (enum error_type *)&the_go_status) отключит предупреждение, но может привести к ошибкам на некоторых платформах.См. Всегда ли sizeof (enum) == sizeof (int)?

2 голосов
/ 20 декабря 2010

Я не уверен, относится ли это именно к вашему предупреждению или нет, но будьте очень осторожно присваивая ссылки на локальные переменные указателям внутри структур.Если the_go_status является локальным, как только ваша функция вернется, ссылка на этот локальный станет недействительной.Таким образом, если ваш код (или чужой код) использует ваш экземпляр error_struct вне функции, объявляющей the_go_status, все быстро сломается.

1 голос
/ 20 декабря 2010

вы должны объявить указатель, если вы хотите использовать указатель:

int * the_go_status

в противном случае вы объявляете примитив, который помещается не в кучу, а в стек.(пожалуйста, исправьте мою ошибку, если я ошибаюсь)

Однако я не понимаю, почему вы вообще хотите использовать указатель.Просто сделайте что-то подобное в определении структуры:

enum error_type status;

и измените свою последнюю строку на:

error_struct.status = the_go_status; 
1 голос
/ 20 декабря 2010

Попробуйте это:

#include <stdio.h>


enum error_type
{
    ERR_1=0
    ,ERR_2=1
    ,ERR_3=2
    ,ERR_4=4
};

struct error_struct
{
    int value;
    error_type status;

};

int main(int argc, char* argv[])
{
    printf("Start\n");

    error_type the_go_status=ERR_1;
    error_struct err;

    err.value=5;
    err.status=the_go_status;


    printf("Done\n");

    getchar();


    return 0;
}
0 голосов
/ 20 декабря 2010

"the_go_status" должен быть набран "enum error_type". Вы можете ввести enum

...