Цель аргумента 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
подарок.