通常在编程竞赛中我忘记哪个库包含哪个函数。因此,我需要一些C代码,可以使用特定的库打印可用的函数。例如。用法:
showAvailFunctions("stdlib.h")
它将打印stdlib.h
库
答案 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;
}