在C中查看函数原型

时间:2016-07-20 20:04:17

标签: c

通常在编程竞赛中我忘记哪个库包含哪个函数。因此,我需要一些C代码,可以使用特定的库打印可用的函数。例如。用法:

showAvailFunctions("stdlib.h")

它将打印stdlib.h

的所有可用功能

1 个答案:

答案 0 :(得分:1)

使用您想要查看的包含文件的include指令创建一个C程序文件。

例如:

#include <stdlib.h>

使用预处理器输出进行编译以生成文件,通常是扩展名为.i的文件,您将拥有包含文件的完整内容。

对于Visual Studio,您可能需要指明是否要保留注释。

输出文件应出现在您的工作目录中。

一种更为复杂的方法示例如下。这是一个C源文本文件,它使用特殊标记进行一系列包含,以显示其中的位置。

源文件底部的程序是一个简单的过滤程序,它读取生成的C预处理程序文件并删除大部分混乱,例如空行或那些指定行号的“#line”行输出和文件来自。

您需要添加要查看的任何包含文件。然后编译两次,一次启用C预处理器输出以生成包含C预处理器输出的文件,并禁用C预处理器输出一次以生成实际可执行文件。您的C编译器可以提供在单个编译中执行这两个步骤的选项。我无法看到如何使用Visual Studio 2013做到这一点。

这是一个示例源文件。我希望您可能需要为编译器和开发环境定制它。这将使用Visual Studio 2013编译并生成输出。我创建了一个简单的.bat文件,该文件从命令行运行此应用程序,并将STDOUT重定向到包含已过滤的C预处理器输出的文本文件。

#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;
}