1、告警
test_cpp.c
#include <stdlib.h>
#include <stdio.h>
int main()
{
char c = 'c';
char *p = &c;
char **pp = &p;
const char **cpp = &p;
char const **c_pp = &p;
char * const *pcp = &p;
char ** const ppc = &p;
return 0;
}
編譯的時候有如下警告:
x@ubuntu:~/Desktop/const$ gcc text_cpp.c
text_cpp.c: In function ‘main’:
text_cpp.c:11:21: warning: initialization of ‘const char **’ from incompatible pointer type ‘char **’ [-Wincompatible-pointer-types]
const char **cpp = &p;
^
text_cpp.c:12:22: warning: initialization of ‘const char **’ from incompatible pointer type ‘char **’ [-Wincompatible-pointer-types]
char const **c_pp = &p;
^
看到上面的警告,第一時間就是有點懵,和"經驗不符“,我們常見的是如下用法:
#include <stdlib.h>
#include <stdio.h>
int main()
{
char c = 'c';
const char *p = &c;
char const *q = &c;
char *const r = &c;
return 0;
}
上述用法都是ok的,編譯不會有告警。我查了很多資料,大致搞清楚了上面告警的原因。上面告警原因在《C專家編程》中有解釋,而且也參考了本文後面網址的資料。
先來看看ANSI C中的規定:“兩個操作數都是指向有限定符或無限定符的相容類型的指針,左邊指針指向的類型必須有右邊指針指向類型的全部限定符“。這句話的前半句強調類型,後半句強調限定符(修飾符)。 出現編譯告警的地方,如果不看修飾符const,賦值完全沒有問題,問題出現在const修飾符。