은 ANSI C에서 다음과 같은 유효합니까?
#include <stdio.h>
/* This returns "Hans" if arg != 0, "Gretel" if arg == 0 */
char* foo(int arg)
{
return arg ? "Hans" : "Gretel";
}
int main()
{
char* p_ch;
p_ch = foo(1);
printf("%s\n", p_ch);
p_ch = foo(0);
printf("%s\n", p_ch);
return 0;
}
코드는 GCC/Linux에서 컴파일되어 실행됩니다.
는 MinGW/윈도우는 말한다 :
invalid conversion from `const char*' to `char*'
MS 비주얼 C/C++ 2008 코드로 괜찮습니다.
char*
변수를 초기화 시점이 아닌 다른 곳에서 리터럴 문자열에 할당 할 수 있습니까?- 문자열 리터럴에
static
할당 클래스가 있음을 읽었습니다. 그들이 정의 된 기능 밖에서 보이지 않는다는 것을 의미합니까? const
유형에서 const가 아닌 카운터 파트로의 변환이 언제 유효하지 않습니까?
''const char * '를 반환하는 것으로'foo'를 선언 할 것입니다. C++로 컴파일되면 코드가 무효화됩니다. 나는 정확히 왜 설명 할 수있는 표준 전문가가 아니다 ... 나는 GCC가 약간의 경고를 할 것으로 기대했을 것이다. (그러나'-Wall -Wextra'가있는 gcc 4.6도 그렇지 않다.) gcc가 C 코드를 컴파일하고 있기 때문에 –
@Basile. 이 문제는 C에서 _nothing_ 잘못된 것입니다. g ++로 컴파일하면 다른 문제가 될 수 있습니다. 그러나 gcc는 완벽하게 유효한 C 코드를 컴파일하려고 시도하면 분명히 문제가되는 것으로 간주하지 않습니다. "언젠가 C++ 컴파일러로 이것을 컴파일하려고 할 때"new라는 변수 이름을 사용할 수 없다는 경고는 아주 귀찮을 것입니다 :-) – paxdiablo
@BasileStarynkevitch :'gcc -Wwrite-strings'는 적절한 경고. 이것은 C 라이브러리의 일부가이 기능에 의존 할 수 있기 때문에 아마도'-Wextra'의 일부가 아닙니다. 예를 들어'strerror'는 리턴 타입'char *'을 갖지만 문자열 리터럴 배열을 사용하여 구현 될 수 있습니다. –