2016-10-09 2 views
3

이 컴파일됩니다 있지만 확실히 잘못된, 나는 이상한 출력 있어요. 누군가 나에게 올바른 방법을 말할 수 있다면 기쁠 것입니다.오버로드 된 함수의 인수로 const char 배열 초기화

void test(const char c[]={'\0'});  //It will compile but strange outputs 
//void test(const char c[]={'x','\0'}); //compile error 

void loop() { 
    const char c[] = {'u','h','u','\0'}; 

    test(); 
    test(c); 
} 

void test(const char c[]){ 
    Serial.println(c); 
} 
+0

죄송합니다. arduino 환경에서 작업 중이며 받아 들였습니다 (경고도 오류도 아닙니다).하지만 여기는 추상적 인 코드 조각입니다. 물론 원래 코드에 다른 이름을 사용하고 있습니다.) – Hydra

+0

나는 이것이라고 생각합니다. Arduino C++ question –

답변

4

0으로 기본 초기화하는 것은 아마도 원하는 것이 아닙니다. const char c[]은 함수 매개 변수로 사용될 때 const char *c으로 컴파일러가 보는 것으로 판명되므로 실제로 빈 문자열 대신 기본값을 NULL으로 지정합니다.

대신

void test(const char *c=""); 

을 할 수 있습니다.

저는 C++ 컴파일러를 사용하고 있다고 가정합니다. C에 기본 매개 변수 또는 다형성이 없으므로이 질문에 C++로 태그하는 것이 좋습니다.

c[] 매개 변수의 구문 및 동작에 대해서는 here이라는 좋은 토론을 찾을 수 있습니다.

그리고 CisNOTthatGOODbutISOisTHATBAD가 지적한 것처럼 더 혼동을 피하기 위해 c를 배열로 선언하는 것은 나쁜 습관입니다. 따라서 const char c[]=""도 잘 작동하지만 좋은 생각은 아닙니다.

+0

오케이. 고마워, 잘된거야. C/C++ 용 avr-g ++ 컴파일러 인 것 같습니다. 다음 번에 기억하겠습니다. – Hydra

+0

'const char c [] = ""'와'const char c [] = { '\ 0'};'완전히 동등한가요? 반면'const char c [] = NULL;'은'c'를'NULL '(빈 문자열의 유효한 메모리 주소가 아님)로 설정합니다. – vsoftco

+0

빈 문자열은 \ 0을 보유하는 메모리의 주소입니다. 이 경우 { '0'}이 (가) char로 컴파일되기 때문에 내가 바꿀 것을 제안했습니다. 사실, 내가 질문에 대답하기 전에 gcc 6.2에서 원래 코드를 컴파일하려고했는데 -fpermissive 플래그를 사용하지 않으면 "char from char *"메시지가 잘못 표시됩니다. (사용 된 https://gcc.godbolt.org/ x86-64 gcc 6.2). 나는 그것이 매개 변수 일 때 규칙이 약간 다르다고 생각하지만 C++ 스펙을 확인하지 않았으므로 확실하지는 않습니다. –

관련 문제