随随便便犯下的C语言错误

变量定义与强制类型转换

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    
    
    for((uint8_t) i = 0; i < 5; i++)
    {
    
    
        printf("variable i is : %d \n", i);
    }

    return 0;
}

编译器提示

image-20210301122355619

问题分析

  变量没有定义?因为数据类型uint8_t 添加了个括号,而(type)表示强制类型转换,因此没有定义就调用,导致报错。

指针指向的地址

/* 数据打印函数指针 */
typedef void (*Print_Func)(const void *);

void int16_value_print(const void * value);
void uint32_value_print(const void * value);

void data_output(Print_Func print, const void * value)
{
    
    
    print(value);
}

/* 主函数 */
int main(void)
{
    
    
    // int16_t s16_temp_val[10] = {-255, 3442};
    // uint32_t u32_temp_val[2] = {85536, 96275};

    int16_t *s16_temp_val = -255;
    uint32_t *u32_temp_val = 85536;

    data_output(uint32_value_print, (void *)u32_temp_val);
    data_output(int16_value_print, (void *)s16_temp_val);

    return 0;
}

编译器提示

image-20210302141724833

问题分析

  函数参数传入的该是指针所指向的具体的地址,而非数据。同时地址处该存着有效的数据

  在上面中,给指针赋值的-255 和 85536都会被认为是一个地址,而且地址不能是个负值。

  解决方法是给变量赋值,然后将指针指向变量的地址。

    int16_t a = -255;
    uint32_t b = 85536;
    int16_t *s16_temp_val = &a;
    uint32_t *u32_temp_val = &b;

结构体数组在.h文件中定义

#define STRING(s)  #s

typedef enum
{
    
    
    state_white_red = 0,
    state_white_yellow,
    state_white_blue,
    state_white_orange,
}State;

typedef struct
{
    
    
    State sta;      ///< 状态对应的常量
    char *str;      ///< 状态对应的标识符(字符串)
} ComparisonInfo;

ComparisonInfo comparison_table[] =
{
    
    
    {
    
    state_white_red,       STRING(state_white_red)},
    {
    
    state_white_yellow,    STRING(state_white_yellow)},
    {
    
    state_white_blue,      STRING(state_white_blue)},
    {
    
    state_white_orange,    STRING(state_white_orange)},
};

编译器提示

statemachine.o:statemachine.c:(.data+0x0): multiple definition of `comparison_table'

问题分析

  任何变量都不该写在.h文件中,但是我为了将用到的数据类型和函数相分开,就写在了.h 文件中

  还遇到一种情况,状态表是状态机数据类型的一部分,若将其分别写在.c 文件和 .h文件中,看起来也并不直观。

  解决方法是添加static , 将其声明为局部的

static ComparisonInfo comparison_table[] =

文件和 .h文件中,看起来也并不直观。

  解决方法是添加static , 将其声明为局部的

static ComparisonInfo comparison_table[] =

猜你喜欢

转载自blog.csdn.net/quanquanxiaobu/article/details/114285395