c语法将const指针传递给const数据到函数
Posted
技术标签:
【中文标题】c语法将const指针传递给const数据到函数【英文标题】:c syntax passing const pointer to const data to function 【发布时间】:2016-05-18 06:35:16 【问题描述】:在第二个参数下面的函数声明中是一个指向常量数据的常量指针。
ti_rc_t ti_uart_write_buffer(const ti_uart_t uart, const uint8_t *const data, uint32_t len);
以下是调用该函数的示例代码。为什么在 BANNER_STR 之前有一个(uint8_t *)
。这是将指向 const 数据的 const 指针传递给函数的常用语法吗?还有其他有效的语法吗?
#define BANNER_STR ("Hello, world!\n\n")
ti_uart_write_buffer(TI_UART_0, (uint8_t *)BANNER_STR, sizeof(BANNER_STR));
谢谢
【问题讨论】:
const
s 函数承诺它不会修改指针(这不是很有意义)或指向的数据 - 这不是对调用者的限制(即调用者可以传入const
或非const
指向const
或非const
数据的指针)。
谢谢,但是当您调用函数时,BANNER_STR 之前的(uint8_t *)
指的是什么?
它将BANNER_STR
从const char*
转换为uint8_t*
,然后将其传递给函数。
这只是糟糕的代码。不要(错过)那样使用宏。只需用文本定义一个普通的const
变量数组或指针。
char
和 uint8_t
通常是不兼容的类型;像这样进行基于指针的别名需要强制转换。您专注于const
,但这是一个红鲱鱼。他们本可以写(const uint8_t *)
并得到相同的最终结果。强制转换的uint8_t *
值结果将隐式转换为const uint8_t *
以匹配函数参数
【参考方案1】:
定义BANNER_STR
是一个字符数组作为它的类型,也就是一个字符串。因此,在您的函数调用中,您需要强制转换此参数以避免编译器警告,但这是调用此函数的有效方法。
另一种有效的语法是使用define指令来声明一个包含要写入的字符串的常量变量:
const char banner_str[] = "Hello, world!\n\n";
ti_uart_write_buffer(TI_UART_0, (uint8_t *)banner_str, sizeof(banner_str));
【讨论】:
鉴于它正在抛弃const
,我不会称之为“正确”。
你是对的,也许“有效”更“正确”以上是关于c语法将const指针传递给const数据到函数的主要内容,如果未能解决你的问题,请参考以下文章