2012-05-11 10 views
1

からthe web私はCにNULというキーワードが含まれていることを理解しています。NUL未宣言 - この関数で初めて使用

しかし、コンパイル中に、私はエラーを取得

NUL undeclared first use in this function' 

私のコードフラグメント:私はこのエラーを取得する理由

for (;;) { 
     char ch = (*pzDest = *pzSrc); 
     if (ch == NUL) 
      break; 
     if (ch == ':') { 
      *pzDest = NUL; 
      break; 
     } 
     pzDest++; 
     pzSrc++; 
    } 

任意のアイデア?

答えて

11

NULLがありますし、その後NULがあります。

NULLはstddef.hで定義され、非常に広く使用されており、NULLポインタへの参照です。

NULは異なります - これは標準ASCII文字セットの最初の文字です。さらに重要なことに、は標準マクロではありません自分で定義する必要があるかもしれません。

はNULを定義するには、実行します。必ず最良の場合には、あなたに何の睡眠の夜と頭痛を与えないため

#define NUL '\0' 
4

いいえ、それは標準ではありません。あなたのコードの先頭にこれを追加するか、単に0使用:私はあなたがそれを参照することが非常に頻繁にある様々な文章でch == NUL

をやっているので、あなたがNULLを探していないinfered

#define NUL 0 

'\0'としてNULとなります。

+0

をしかし、次のリンクは、Cは、キーワード「NULを持っていると言います" www.allinterview.com/showanswers/27930.html – Tinyspark

+0

@Tinyspark実際には、このスレッドの多くの人が「NUL」は標準ではないと言いました。 – cnicutar

+0

これが彼の意図であれば、コードは "* pszDest = 0;"というだけで読みやすくなります。標準で使用される非標準定数の定義を探し回らなければならないという面倒を避けますCプログラミング操作(つまり、文字列の終了)。 – selbie

2

NULLであり、NULではありません。

編集

あなたが投稿したリンクを読んでいましたか?それは非常に具体的には「NULLはNULではありません.NULはC++で定義されたキーワードではありません」

NULLはNULLポインタで定義されたマクロです。
NUL は、ASCII文字セットの最初の文字の名前です。 はゼロ値に対応します。そこには、の
という標準マクロNULはありませんが、定義するのが好きな人もいます。
数字0は の値に対応し、10進数は80です。数字0を??の値と混同しないでください。 (NUL)!
NULLは((void *)0)、NULを??として定義できます。

1

は、独自のNULL値を定義することは、標準、そして非常にエラーが発生しやすく、その意志ではありません。 NULLの概念に

問題は、CおよびCの間++とC++ C++ 98、C++ 0xの内値、およびC++ 11は新しいものではありません、これはなぜ以降のC++ 0xのからnullptrマクロは、問題を回避して少し調和させるために導入されました。

レガシーNULL負担の問題から継承したコードを使用しかし、もし:あなたの外観とLIBSがなど含まれているために、ご使用の構成に応じて、

を、あなたはそのNULLを確保する必要があるかもしれませんが定義されています定刻。

#ifndef _LINUX_STDDEF_H 
#define _LINUX_STDDEF_H 

#undef NULL 
#if defined(__cplusplus) 
#define NULL 0 
#else 
#define NULL ((void *)0) 
#endif 

#endif 

例:

最も簡単な方法は、「STDDEF.H」を、含まSTDDEF.Hの内容は、お使いのシステム/ Linuxの味に応じて、多くの異なるかもしれないことに注意することで、これは一例です:

i2cライブラリを使用して、Raspberry-piでi2cバスを駆動しようとすると、問題が発生しました。 I2C libに含めて私の場合は が十分ではなかった、私は、I2C libに、ヘッダの代わりに含めるutils.hファイルを作成する必要がありました:

#ifndef UTILS_H 
#define UTILS_H 

/// if you have to use i2c-dev.h then use this utils header instead of make sure to include stddef.h before. 
/// otherwise you will end up with the following error: 
/// .../arm-unknown-linux-gnueabi/arm-unknown-linux-  gnueabi/sysroot/usr/include/linux/i2c-dev.h:175: error: 'NULL' undeclared (first   use in this function) 
/// return i2c_smbus_access(file,value,0,I2C_SMBUS_QUICK,NULL); 
///              ^
#include <stddef.h> 
#include <linux/i2c-dev.h> 
#endif // UTILS_H 
関連する問題