2016-07-20 8 views
-4

プログラミングコンテスト中に、どのライブラリにどの関数が含まれているのか忘れがちです。したがって、特定のライブラリで利用可能な関数を出力できるCコードが必要です。例えば。使用方法:Cで関数プロトタイプを表示

showAvailFunctions("stdlib.h")

、それはstdlib.hライブラリ

+4

は、ファイル「STDLIB.H」 を開き、それはまた、プログラム的に行うことができるが、あなたのIDEが行うべきものだそれ(あなたはまた、コードでこれを行うことができます)...それはプロトタイプだ –

+1

をお読みください。 – tambre

+0

あなたの機能を使用してIDEに必要なヘッダをすべて追加することができればそれは良いことではないでしょうか? – melpomene

答えて

1

を持つすべての利用可能な機能は、あなたが見たいと思ってインクルードファイルのためのincludeディレクティブでCのプログラムファイルを作成して印刷します。例えば

#include <stdlib.h> 

、ファイルを生成するために、プリプロセッサの出力をコンパイルし.iの拡張子を持つ通常のファイルとインクルードファイルの完全な内容を持っています。

Visual Studioの場合、コメントを残すかどうかを指定する必要があります。

出力ファイルが作業ディレクトリに表示されます。

さらに複雑なアプローチの例は次のとおりです。これはCソーステキストファイルで、何がどこにあるかを示す特別なマーカーを含む一連のインクルードを行います。

ソースファイルの一番下にあるプログラムは、生成されたCプリプロセッサフ​​ァイルを読み込んで、空白行や行番号を指定する出力の "#line"行などのクラッタの大部分を削除する単純なフィルタプログラムです。それが元になったファイル

表示したいインクルードファイルを追加する必要があります。その後、Cプリプロセッサ出力を有効にしてCプリプロセッサ出力を含むファイルを生成し、Cプリプロセッサ出力を無効にして実際の実行可能ファイルを生成するように、Cプリプロセッサ出力を有効にして、2回コンパイルします。あなたのCコンパイラは、単一のコンパイルで両方のステップを実行するオプションを提供するかもしれません。 Visual Studio 2013でそれを行う方法がわかりませんでした。

ここにソースファイルの例を示します。私はあなたのコンパイラと開発環境のためにこれを調整する必要があると思います。 Visual Studio 2013で出力をコンパイルして生成します。このアプリケーションをコマンドラインから実行し、STDOUTをフィルタ処理されたCプリプロセッサの出力を含むテキストファイルにリダイレクトする単純な.batファイルを作成しました。

#define MAKE_SEP_STRING "<!-- #$%^&*()_+-=qwrtv -->" 
#define MAKE_SEP_STRING_END "<!--END #$%^&*()_+-=qwrtv -->" 
#define MAKE_SEP_BEGIN(x) static const char X_##x [] = MAKE_SEP_STRING #x; 
#define MAKE_SEP_END 

MAKE_SEP_BEGIN(stdio); 
#include <stdio.h> 
MAKE_SEP_BEGIN(stdlib); 
#include <stdlib.h> 
MAKE_SEP_END 

#include <string.h> 
int main(int argc, char* argv[]) 
{ 
    if (argc < 2) { 
     printf("output file must be specified.\n"); 
     return 1; 
    } 
    else { 
     char *sep = MAKE_SEP_STRING_END; // if we want to determine where each file begins or ends. 
     FILE *pFile; 

     fopen_s(&pFile, argv[1], "r"); 

     if (pFile) { 
      char hugeBuffer[4096]; 

      // read through the C Preprocessor output file and eliminate empty lines. 
      // there can be a lot of empty lines. 
      while (fgets(hugeBuffer, 4000, pFile)) { 
       if (strlen(hugeBuffer) > 5) { 
        // discard all those tons of #line n text lines generated by the Preprocessor 
        if (strncmp(hugeBuffer, "#line ", 6) == 0) continue; 
        if (strcmp(hugeBuffer, sep) == 0) 
        { 
         break; 
        } 
        printf("%s\n", hugeBuffer); 
       } 
      } 
      fclose(pFile); 
     } 
    } 
    return 0; 
} 
+0

私はプログラムの出力自体に結果を出したいです – Himanshu

+0

作業コードで詳細を教えてください... – Himanshu

+0

@Himanshu、私は追加しましたこの例を調整する必要があるでしょう。 –

関連する問題