c - void 指针发出警告正常吗?

标签 c pointers

我正在做一个学校项目,我要走出去以获得更好的成绩
话虽如此,我正在尝试使用 void 指针和类型转换来使我的程序对于我抛出的任何类型的场景都尽可能通用。

我做了一些代码,它做了它应该做的一切,但每当我重建所有代码时它都会给我一些警告,但在编译时没有警告。

旁注:我知道我正在将整数返回给指针,但我无法返回本地指针,否则它不会给我需要的结果。

#define VERDADEIRO 1
#define FALSO 0
void * removido(info* tab,int pos)
{
    if(strcmp(tab[pos].nome,REMOVIDO) != 0)
    {
    return FALSO;
    }
    else
    {
    return VERDADEIRO;
    }
}
void * vazio(info* tab,int pos)
{
    if(strcmp(tab[pos].nome,CHAVENULA)!= 0)
    {
    return FALSO;
    }
    else
    {
        return VERDADEIRO;
    }
}

int listar(info * tab)
{
int i,c=0,j;

for(i=0;i<HASHTAM;i++)
{
    if((int *)removido(tab,i) ==FALSO && (int *)vazio(tab,i)==FALSO)
    {
    printf("Nome: %s",tab[i].nome);
    printf("NIF: %d\n",tab[i].NIF);
    printf("Morada: %s",tab[i].morada);
    printf("Telefone: %d\n",tab[i].telefone);
    printf("Codigo Postal: %d - %d\n",tab[i].codigopostal/1000,tab[i].codigopostal%1000);
    printf("Data de nasicmento: %d - %d - %d\n",tab[i].datanascimento%100,(tab[i].datanascimento%10000)/100,tab[i].datanascimento/10000);
    printf("Associado: %s\n",tab[i].infoassociado.associado);
    if(associado(tab,i)==VERDADEIRO)
    {
        for(j=0;j<10;j++)
        {
            printf("Cota de %d anos atras - Estado: %c\n",j+1,tab[i].infoassociado.cotas[j]);
        }
    }
    c++;
    }
}

警告是指针和整数之间的比较,返回使指针来自整数而不进行强制转换。

最佳答案

不,他们不正常。他们告诉您,您使用的指针不正确。 FALSOVERDADEIRO 不是指针。

返回 true 和 false 的函数不适合使用 void 指针或一般指针。您也不必定义自己的真值和假值。而是使用 stdbool.h 中的 bool 值 truefalse 。 (注:这是在 C99 中添加的,一些教授坚持 C90 标准。)

#include <stdbool.h>

bool removido(info* tab,int pos)
{
    if(strcmp(tab[pos].nome,REMOVIDO) != 0) {
        return false;
    }
    else {
        return true;
    }
}

bool vazio(info* tab,int pos)
{
    if(strcmp(tab[pos].nome,CHAVENULA)!= 0) {
        return false;
    }
    else {
        return true;
    }
}

然后您可以使用普通的 bool 检查简单地检查返回值是 true 还是 false。

if( !removido(tab,i) && !vazio(tab,i) ) {
   ...
}
<小时/>

请注意,双重否定会使代码难以理解。如果您检查是否相等并返回 true,那就更简单了。

bool vazio(info* tab,int pos)
{
    if(strcmp(tab[pos].nome,CHAVENULA)== 0) {
        return true;
    }
    else {
        return false;
    }
}

要真正简化代码,您可以利用 strcmp(...) == 0 返回一个 bool 值(从技术上讲,它返回 0 或 1,可以用作 bool 值)并减少这些功能集中到一行。

bool removido(info* tab,int pos)
{
    return strcmp(tab[pos].nome,REMOVIDO) == 0;
}

关于c - void 指针发出警告正常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43011524/

相关文章:

关于 sizeof 溢出 size_t 的 C 标准

c - 意外标记附近出现语法错误 '('

c++ - 全局指针由优化器解析 - 但引用不是 - 为什么?

c - 为什么我在链表开头插入节点的函数第二次失败了?

c - 多个链接指针

php - 在 Linux 中的 PHP 和 C 可执行文件之间传递数据

c - 指向字符串的 void 指针在 C 中无法正确输出

c - strcpy 损坏 char 数组(字符串值)

C++ : how is a reference to the value of a pointer is updated when the pointer itself changes?

c - 将 int 数组分配给 int 指针