【问题标题】:c syntax passing const pointer to const data to functionc语法将const指针传递给const数据到函数
【发布时间】: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 * 以匹配函数参数

标签: c function pointers arguments


【解决方案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,我不会称之为“正确”。
  • 你是对的,也许“有效”更“正确”
猜你喜欢
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多