【问题标题】:why do many apis use "const obj *" over "obj * const" for their input arguments? [duplicate]为什么许多 API 使用“const obj *”而不是“obj * const”作为输入参数? [复制]
【发布时间】:2018-06-14 17:38:29
【问题描述】:

我到处都能看到:

  1. http://www.cplusplus.com/reference/cstdio/printf/ -> printf 采用const char *fmt 而不是char * const fmt 的格式。
  2. https://msdn.microsoft.com/en-us/library/e0z9k731.aspx -> 字符串接受为 const 指针而不是指针 const。
  3. glShaderSource: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glShaderSource.xhtml -> 字符串被当作 const 指针而不是指针 const。
  4. https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx -> messageboxa/messageboxw 使用指向字符串的 const 指针而不是指向 const 的指针。

我是不是误解了什么,或者这只是对 api 设计者如何用 C 表达事物的误解?

据我了解,

  1. const char *a,是指向一个字符的指针,您不能将其更改为指向另一个字符。
  2. char * const a 是一个指向您无法取消引用以更改其值的 char 的指针。
  3. const char * const a 是一个指向 char 的指针,您不能将其更改为指向另一个 char(或包含许多字符的连续块的第一个 char),并且您不能通过取消引用来更改指向的 char 的值。

提前谢谢。

看来我是另辟蹊径:

char *elephant = "elephant";
const char *p1 = "wolf";
char * const p2 = "sheep";

int main(int argc, char **argv)
{
    p1 = elephant;
    *p1 = elephant[0]; /* error: assignment of read-only location '*p1' */

    p2 = elephant; /* error: assignment of read-only variable 'p2' */
    *p2 = elephant[0];

    return 0;
}

类比:

#define ptrto(X) X *
#define readonly(X) X const

char const a = 'a';
const char b = 'b';

readonly(ptrto(char)) p1 = "p1";
ptrto(readonly(char)) p2 = "p2";

int main(int argc, char **argv)
{
    p1 = &a; /* error: assignment of read-only variable 'p1' */
    *p1 = a; 

    p2 = &a; 
    *p2 = a; /* error: assignment of read-only location '*p2' */

    p1 = &b; /* error: assignment of read-only variable 'p1' */
    *p1 = b; 

    p2 = &b; 
    *p2 = b; /* error: assignment of read-only location '*p2' */


    return 0;
}

【问题讨论】:

  • 你把 1. 和 2. 弄混了,它们是相反的。
  • 病态测试是肯定的。
  • 嗯.. const obj * 和 obj *const 是两个完全不同的东西。如果他们需要const obj *,为什么还要使用obj *const?
  • 这里有一个技巧可以帮助您:从右到左阅读。 char * const a; 读作“a 是指向 char 的 const 指针”。 const char * a; 是“a 是指向 char 常量的指针”。
  • const T * 和T const * 指定一个指向常量T 的指针。 T * const 指定一个指向T的常量指针。大多数 API 使用 const T * 或 T const *,因为它们承诺不会更改指向的内容。

标签: c pointers


【解决方案1】:

见http://en.cppreference.com/w/c/language/const

const char * == char const * 是指向不可修改字符数据的指针。

char * const 是一个不可修改的指向字符数据的指针。

【讨论】:

  • (const char * == const char *) 不正确,char *elephant = "elephant"; const char *p1 = "wolf"; char * const p2 = "sheep"; int main(int argc, char **argv) { p1 = elephant; *p1 = elephant[0]; /* error */ p2 = elephant; /* error */ *p2 = elephant[0]; return 0; } 表明我的编译器对它们的处理方式不同。
  • @Dmitry 请再读一遍。
  • en.cppreference.com 不是语言标准,6.7.6.1 Pointer declarators - C11 (draft n1570) 是(至少是最后的免费草案)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
相关资源
最近更新 更多