对于C++,方括号中的标题必须总是在引号中的标题之上吗

Do bracketed headers have to always be above quoted headers for C++?

本文关键字:标题 C++ 方括号 对于      更新时间:2023-10-16

编译C++源文件时,如果您有多个由带括号和带引号的标头组成的标头,那么带括号的标头是否必须始终列在第一位?

我把一个带引号的头放在一个带括号的头之前,这开始给我重新定义编译器错误。

头文件(utility.h(是:

#ifndef _UTILITIES_H
#define _UTILITIES_H
#include <vector>
double calcNorm(std::vector <double> array);   //template?
#endif

源文件(utilities.cpp(是

#include <math.h>
#include <vector>
#include "utilities.h"
double calcNorm(std::vector <double> array)   //template?
{
int n;
double norm = 0;
n = array.size();
for (int i = 0; i < n; i++)
{
norm += array[i]*array[i];
}
norm = sqrt(norm);
return norm;
}

以前,在源文件中,我在括号中的标题上方有#include "utilities.h",我得到了以下编译器错误:

g++ -g -Wall -c utilities.cpp
utilities.cpp: In function ‘double calcNorm(std::vector<double>)’:
utilities.cpp:5:8: error: redefinition of ‘double calcNorm(std::vector<double>)’
double calcNorm(std::vector <double> array)   //template?
^
utilities.h:3:8: note: ‘double calcNorm(std::vector<double>)’ previously defined here
makefile:12: recipe for target 'utilities.o' failed

编译C++源文件时,如果您有多个由带括号和带引号的标头组成的标头,那么带括号的标头是否必须始终列在第一位?

否。

头文件(在源文件中,以及在其他头文件中(可以是任何顺序。事实上,甚至不需要在源文件的开头包含头文件,只要每个头文件都在依赖于头声明的任何声明之前。在这方面,是使用尖括号还是使用双引号指定路径无关紧要。

从技术上讲,一个头的编写方式可以强制在它之前包含其他头,但这通常是一种糟糕的代码气味,通常是一个错误。


预编译头是一个例外,它是一些编译器实现的非标准功能。预编译的头必须在源文件的任何声明(以及任何其他包含(之前。

嗯。我想我发现了问题。我在目录中有一个名为utilities.h.gch的二进制文件(不确定它来自哪里(。我删除了它,编译器问题就消失了。

啊。gch是预编译头使用的文件扩展名,这解释了为什么您的示例不足以重现您的问题。有关预编译头的行为的更多详细信息,请参阅编译器手册。

"括号内的标题必须总是列在第一位吗"-不。

它与includes的顺序无关,而与如何搜索includes的规则有关。像#include "foo.h"这样的include语句将导致预处理器首先在源文件的当前目录中查找,然后在您提供的任何include路径(以及默认路径(中查找。像#include <foo.h>这样的include语句将执行相同的操作,只是它将跳过最初的"在当前目录中查找"步骤。

否。尖括号中的标题和引号中的标题之间的唯一区别是系统将在哪里查找它们。(请注意,标准标头可能根本不作为单独的文件存在;这是一个不需要担心的实现细节。(

简短回答:不。

长话短说:#include指令几乎是将该文件的内容粘贴到源代码中。在使用其任何功能之前,必须包含标头。时期如果您在末尾包含iostream,但不使用该标头,则不会有问题