Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;检查标头是自给自足的 P>有一些工具,将解析C++项目并决定 头文件是否自给自足: i、 e.如果文件Foo.cc(或Foo.h)提到某个类条(例如vector),那么 它本身包含一个头文件 定义类(文件定义栏,例如)_C++_Include_Dependencies_Header Files - Fatal编程技术网

C++;检查标头是自给自足的 P>有一些工具,将解析C++项目并决定 头文件是否自给自足: i、 e.如果文件Foo.cc(或Foo.h)提到某个类条(例如vector),那么 它本身包含一个头文件 定义类(文件定义栏,例如)

C++;检查标头是自给自足的 P>有一些工具,将解析C++项目并决定 头文件是否自给自足: i、 e.如果文件Foo.cc(或Foo.h)提到某个类条(例如vector),那么 它本身包含一个头文件 定义类(文件定义栏,例如),c++,include,dependencies,header-files,C++,Include,Dependencies,Header Files,编辑:我想澄清一下:如果一个头文件Foo.h提到vector和它的一个include 已经包含向量,编译器很高兴。我不想那样。如果Foo.h提到向量 总之,它应该直接包含它,而不依赖于另一个标头。编译器是否捕捉到这一点?编译器将为您执行此操作。许多C++样式指南强烈建议,所有的.CPP文件都应该包含相应的头作为第一个实质性的包含指令。 < P>我为此使用了一个脚本。以下是一个简化版本: #!/usr/bin/env bash # hcheck: Check header file syntax

编辑:我想澄清一下:如果一个头文件Foo.h提到vector和它的一个include 已经包含向量,编译器很高兴。我不想那样。如果Foo.h提到向量
总之,它应该直接包含它,而不依赖于另一个标头。编译器是否捕捉到这一点?

编译器将为您执行此操作。许多C++样式指南强烈建议,所有的.CPP文件都应该包含相应的头作为第一个实质性的包含指令。

< P>我为此使用了一个脚本。以下是一个简化版本:

#!/usr/bin/env bash
# hcheck: Check header file syntax (works on source files, too...)
if [ $# -eq 0 ]; then
    echo "Usage: $0 <filename>"
    exit 1
fi

for f in "$@" ; do
    case $f in
        *.c | *.cpp | *.cc | *.h | *.hh | *.hpp )
            echo "#include \"$f\"" > hcheck.cpp
            printf "\n\033[4mChecking $f\033[0m\n"
            make -s hcheck.o
            rm -f hcheck.o hcheck.cpp
            ;;
    esac
done
#/usr/bin/env bash
#hcheck:检查头文件语法(也适用于源文件…)
如果[$#-eq 0];然后
echo“用法:$0”
出口1
fi
对于“$@”中的f;做
案例$f英寸
*.c.*.cpp.*.cc.*.h.*.hh.*.hpp)
echo“#包括\“$f\”>hcheck.cpp
printf“\n\033[4M$f\033[0m\n”
make-shcheck.o
rm-f hcheck.o hcheck.cpp
;;
以撒
完成
当然,您需要有一个
Makefile
。如果您不需要,那么用一个适当的
gcc
命令替换
make
行(不要忘记任何标志!)。如果
Makefile
将对象放在当前目录以外的某个位置,您还需要调整它


我相信还有很多改进要做。当我告诉人们这件事时,下意识的反应是“编译标题是个愚蠢的想法,”但它对我来说效果很好,可以用于没有源代码或没有首先包含在源代码中的头文件。

减轻实现自给自足头文件目标的负担的一种方法是确保任何类(通常)或自由函数(有时)声明有非常具体的意图,如坚持单一责任原则。这样做,需要包含标题的依赖性将减少。

我不知道有这样的工具。问题不像看起来那么容易解决。例如,以下哪些标题文件应该按顺序包含自给自足

#ifdef FOO
  std::vector<int> getVector();
#endif

  void doStuff(std::string);
#ifdef FOO
std::vector getVector();
#恩迪夫
void doStuff(标准::字符串);
它可能需要,也可能不需要,包括
。这取决于是否定义了
FOO
,可能需要,也可能不需要,这取决于在此文件之前包含的内容


一般来说,预处理器宏实际上会干扰任何“隔离”读取头的尝试.

你能把问题说得更清楚一点吗?但是,现在看来,你唯一需要的是在你的文件上运行编译器……有一些静态分析工具,比如PC Lint,它可以报告缺少的头。你想要这样的工具还是自动导入所有缺少的头的工具?一种简单的方法是随机排列
#包括
指令,并查看它是否编译(自动化!)。否则,没有编译器支持(我怀疑存在),这是不可能的。然后诀窍是检查没有相应源文件的头文件。你可以用与cpp文件完全相同的方式将头文件传递给编译器。不过,让每个头都有一个cpp文件会更容易,即使它除了include之外是空的。@MikeDeSimone:它不需要任何费用(1)仅为此目的创建一个空源文件。(1)除了一点构建时间之外,我想。这就是为什么我的答案使用
make
,它应该为构建定义了所有必要的标志。但是这带来了它自己的假设。另外,在您的示例中,
#include
行将放在
#ifdef FOO
/
#endif
对中。但是如果定义没有呢来自编译器?如果它依赖于另一个头中的
#define
,该头可能包含在这个头中,也可能不包含在这个头中呢?当然,
#include
应该放在
#ifdef
/
#endif
对中。但是自动验证是否正确,只会得到很多harderA头,期望一个要在条目上定义的符号应该调用
#error
,如果该符号未定义。或者它应该设置默认值。这是一个有效的测试。此外,可以调用
export DEFINES=-DMODE\u TWO
或其命令行上的任何内容,以便
make
拾取变量。同样,如果您的需求很复杂,那么您需要IPT测试。你能解释脚本的确切内容吗?我的脚本从命令行中获取参数列表,对于每一个C或C++文件的某个形式,它创建一行一行代码> > CPP<代码>文件,代码<>代码包含被测试文件 >,然后告诉<代码>使< /C> >从源文件创建一个对象。<代码>>make通常有一个通用后缀规则,可以一步从任何
.cpp
创建任何
.o
,因此会调用此规则(以及makefile的任何变量设置)。如果文件良好,则除了“检查”和文件名外,不会打印任何内容。如果文件不好,则编译器错误会在“检查”行。