Цель аргумента const кроме того, чтобы избежать ошибки

Я программирую микроконтроллер 8051, используя компилятор keil C51 C, который поддерживает только C90.

Я хочу отправить байт данных через UART, функция выглядит так:

void Uart_send(char data){
   //...
}

Используйте 1:

char a = 123;
Uart_send(a); //work great

Используйте 2:

Uart_send(123);//doesn't work, but no error or warning from compiler

В последнем случае отправляется 1 байт, но не правильное значение (123).

Если я изменю свой код на:

void Uart_send(const char data){
   //...
}

Тогда все работает отлично.

Исходя из моего понимания и нескольких источников в Интернете, единственная цель "const" - не дать функции изменить свой аргумент (иными словами, предотвратить программист от изменения аргумента по ошибке). Тогда почему мой второй метод не работает?

Изменить: это мой полный код:

uart.h

typedef struct {
    char Buffer[10];
    char *p;
    char Ready;
    void (*Load)(char Data);
    void (*Transmit)();
    void (*Flush)();
} _uart;
extern _uart UART;

uart.c

#include "UART.h"
#include <reg51.h>

#define EOF 0x00
/*
0000_0000: EOF
0000_0001: countdown
1xxx_xxxx: primary time set
1xxx_xxxx: secondary time set
0111_xxxx: set phase

*/
#define Wait() for(i = 0; i < 3; ++i)
void Load(const char Data){
    *UART.p = Data;
    if(Data == EOF){
        UART.Ready = 1;
    }
    ++UART.p;
}
void Transmit(){
    int i;
    char *p;
    p = UART.Buffer;
    while(1){
        SBUF = *p;
        while(~TI);
        TI = 0;
        Wait();//make sure slave finish process data before sending next byte
        if(*p == EOF) break;//we are done
        ++p;
    }
    UART.Flush();
}
void Flush(){
    UART.p = UART.Buffer;
    UART.Ready = 0;
}
_uart UART = {
    {EOF, EOF, EOF, EOF, EOF, EOF, EOF, EOF, EOF, EOF},
    UART.Buffer, 0,
    Load,
    Transmit,
    Flush
};

main.c

#include "UART.h"
//.....
UART.Load(123);
UART.Load(0x00); //0x00 = EOF
UART.Transmit();

2 ответа

Теперь, когда мы увидим ваш код, проблема ясна: у вас нет описания функции (прототипа) в заголовочном файле.

В Си вам действительно нужно объявлять вещи, прежде чем вы сможете их использовать, иначе компилятор не узнает о них.

Обратите внимание, что между стандартными версиями есть большая разница. В более старых стандартах C (до C99) использование функции неявно объявлялось путем выведения типов аргументов из вызова (что в вашем случае было бы неверным, поскольку 123 является int). С C99 и далее это больше не разрешено.

Цель аргумента const кроме того, чтобы избежать ошибки

Компилятор может сделать некоторые оптимизации с const подарок.

Другие вопросы по тегам