GLib에 관해 간단한 질문이 있습니다.GLib이이 함수에서 'const'를 사용하지 않는 이유는 무엇입니까?
static const char *words[] = { "one", "two", "three", NULL };
void main() {
puts(g_strjoinv("+", words));
}
이 코드 인쇄 one+two+three
:
나는 다음과 같은 코드가 있습니다. 문자열을 조인하는 GLib 함수를 사용합니다. 그 함수의
에게 signature은 다음과 같습니다
char *g_strjoinv (const char *separator, char **str_array);
(. 정확하게하려면 입심이되지 char
, gchar
사용하지만의이 무시하자)
지금, 나는이 매개 변수가 왜 궁금 char **str_array
및 아닙니다 const char **str_array
. 그것은 컴파일러의 경고를 제거하는 명시 적 캐스트를 할 저를 강제로 (" '문자 **'하지만 인수는 '** const를 문자'유형 인 기대") :
puts(g_strjoinv("+", (char **)words));
나는 GLib's reference 및 I 보면 그 을 모두보십시오이 방법으로 정의 된 기능 : 그들이 char **
, 아니 const char **
받아들입니다.
왜 그럴까요? GLib에서 const char **
을 사용하지 않는 이유는 무엇입니까?
const를 제거하기 위해 명시 적 형변환을 사용해야하는 이유는 컴파일러가 더 이상 인수의 호환성을 검사하지 않기 때문에 내 코드를 안전하지 않게 만듭니다. 또한 GLib은 내 데이터를 변경하지 않는다고 말하는 "계약서에 서명하지"않기 때문에 걱정이됩니다.
위대한 질문으로, str_array는 확실히 변경되지 않습니다 (?).이 경우 const가 적합합니다. – this
@self : 그래,이 기능만으로는 문제가되지 않습니다. GLib 함수의 * all *에 문자열 배열을 허용합니다. 나는 그들이 이것을하기에 좋은 이유가 있다고 생각하고 그것이 무엇인지를 알고 싶다. –
[이 질문] (http://c-faq.com/ansi/constmismatch.html)을 참조하십시오. 전적으로 가능하다면'const char **'를 기대할 수있는 함수에 전달할 수 없기 때문에 문제가 해결되지 않을 것입니다. 그것을 그대로 선언한다. –