2016-10-09 5 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++の質問 –

答えて

4

ゼロへのデフォルトの初期化は、おそらくあなたが望むものではありません。 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からchar *への無効な変換メッセージが返されます。 (https://gcc.godbolt.org/でx86-64 gcc 6.2を使用)。私は、それがパラメータであるとき、ルールはわずかに異なりますが、私はC++仕様をチェックしていないので、私は確信していないと思います... –

関連する問題