传递参数中的指针目标在签名方面有所不同

时间:2015-07-30 17:12:13

标签: c pointers warnings signedness

我已经阅读了类似的问题,但在这种情况下,我找不到能帮助我理解这个警告的问题。我正在尝试学习C的第一周,所以请提前道歉。

我收到以下警告并注意:

In function 'read_line':
warning: pointer targets in passing argument 1 of 'read_byte' differ in signedness [-Wpointer-sign]
   res = read_byte(&data);  
   ^
note: expected 'char *' but argument is of type 'uint8_t *'
 char read_byte(char * data) 

尝试编译此代码时:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>

char read_byte(char * data) 
{
    if(fs > 0 )
    {
        int n = read(fs, data, 1);
        if (n < 0)
        {
            fprintf(stderr, "Read error\n");
            return 1;
        }
    }
    return *data;
}

uint8_t read_line(char * linebuf) 
{
    uint8_t data, res;
    char * ptr = linebuf;

    do
    {
        res = read_byte(&data);         
        if( res < 0 )
        {
            fprintf(stderr, "res < 0\n");
            break;
        }

        switch ( data )
        {
            case '\r' :
                break;
            case '\n' : 
                break;
            default : 
                *(ptr++) = data;
                break;
        }

    }while(data != '\n');
    *ptr = 0;               // terminaison
    return res;
}

int main(int argc, char **argv)
{
    char buf[128];

    if( read_line(buf) == 10 )
    {
        // parse data
    }

    close(fs);
    return 0;
}

我删除了无用的部分,包括打开端口并初始化fs的部分。

2 个答案:

答案 0 :(得分:5)

char是签名类型。 uint8_t未签名。因此,您将指向无符号类型的指针传递给需要签名的函数。您有几种选择:

1)更改功能签名以接受uint8_t*而不是char*

2)将您传递的参数类型更改为char*而不是uint8_t*(即将data更改为char)。

3)调用函数时执行显式转换(不太优选的选项)。

(或者忽略警告,我不会将其作为选项包括在内,认为它错了)

答案 1 :(得分:1)

您要发送uint8_t

类型的地址
res = read_byte(&data);

并以char *

收到
char read_byte(char * data)