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));

谢谢

【问题讨论】:

consts 函数承诺它不会修改指针(这不是很有意义)或指向的数据 - 这不是对调用者的限制(即调用者可以传入const 或非const 指向const 或非const 数据的指针)。 谢谢,但是当您调用函数时,BANNER_STR 之前的(uint8_t *) 指的是什么? 它将BANNER_STRconst char* 转换为uint8_t*,然后将其传递给函数。 这只是糟糕的代码。不要(错过)那样使用宏。只需用文本定义一个普通的const 变量数组或指针。 charuint8_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数据到函数的主要内容,如果未能解决你的问题,请参考以下文章

小白学习C++ 教程八在C++指针传递引用和Const关键字

将数组作为 C++ 中方法的 const 参数传递

const

C++ NULL 指针和 const 正确性

将 const 对象引用传递给仿函数

无法将'const pointer const'传递给const ref