2011-01-10 4 views
5

私は#include <ctype.h>を含まない下記のプログラムを書いています。私はプログラムを実行することができます。これらのプロトタイプはどこに宣言されていますか?私はgccを使用しています。あなたのコードで#includeを含まない

1.

#include <stdio.h> 
int main() 
{ 
    if(isalnum(';')) 
     printf("character ; is not alphanumeric"); 
    if(isalnum('A')) 
     printf("character A is alphanumeric "); 
    return 0; 
} 

2.

#include <stdio.h> 
int main() 
{ 
    printf("Lower case of A is %c \n", tolower('A')); 
    printf("Lower case of 9 is %c \n", tolower('9')); 
    printf("Lower case of g is %c \n", tolower('g')); 
    printf("ASCII value of B is %d \n", toascii('B')); 
    printf("Upper case of g is %c \n", toupper('g')); 
    return 0; 
} 
+0

無効な引数を渡そうとすると、コンパイラがプロトタイプが宣言されている場所を出力することがあります。 – XAder

+0

どのコンパイラを使用していますか?どのバージョンのC? –

+1

'if(isalnum( ';'))printf("は英数字ではありません ");'?本気ですか? – Benoit

答えて

8
  1. これらの機能は、暗黙的にを宣言されているので、彼らは、任意の特定のヘッダから含まれていません。あなたのコンパイラの警告レベルをクランクアップした場合、あなたは(例えばGCC)が表示されます:関数の定義が利用できない場合

    $ gcc -Wall -o a.c 
    a.c: In function ‘main’: 
    a.c:4: warning: implicit declaration of function ‘isalnum’ 
    

    を、コンパイラが、私は任意の数の引数を取り、intを返す関数だと仮定し。たとえば、次のコンパイル:

    main(){fgetc(1,2,3,4,5);} 
    
  2. は、彼らが宣言すべき場所については、それは<ctype.h>ヘッダーです。もちろん、別のC実装ではこのヘッダーを他のヘッダーに含めることができるので、コードに<ctype.h>を含めずに動作するように見えるかもしれませんが、別のC実装で警告なしにコードをコンパイルする場合はこのヘッダーを含める必要があります。

+0

私はgccでコンパイルしましたが、警告が表示されませんでした.......正しく動作しています – venkat

+0

@venkat、 'gcc -Wall xc'を試してください –

+0

はい、警告が表示されています....... Wallオプションを使わずに正しい答えを得ています.....しかし、私の質問はctype.h以外のプロトタイプが宣言されているところです – venkat

2

機能が使用されるように宣言する必要はありません(しかし、私はそのような場合に警告を与えるために近代的なCコンパイラを期待する)それが正しい引数で使用されている場合。 1少なくとも1つのという名前のparamaterを必要とする - - と、それは可変引数関数が使用できた場合、関数は

int isalnum(); 

(とない

int isalnum(...); 

Cされていないと宣言されたかのように、それはあります非多様変数とは異なる呼び出し規約)。

これは、プロモーションによって触れられていないパラメータを持つintを返す関数に対してのみ可能です(charとshortはプロモーションによって呼び出され、標準ライブラリの関数は歴史的理由からしばしばこのクラスにあります)。

+0

ああ、技術的には私はあなたが正しいと思う、AProgrammer ..私が作ってみようとしているのは、関数呼び出しに使うコードがスタックのクリーンアップを担当しているため、呼び出された関数それをクリアしていただきありがとうございます。 –

+1

'int isalnum(...);'は無効ですC:可変関数に少なくとも1つの名前付きパラメータが必要です – Christoph

+0

@Christophe、右。忘れてしまった(CとC++の違い、CよりもC++のほうが多い) - 名前付きパラメータを持たない可変関数は、テンプレートのトリック以外では非常に便利です。それは主に、以来削除されている答えによる追加でした。 – AProgrammer

関連する問題