功能声明是强制性的吗?

时间:2014-07-11 14:56:16

标签: c++ opencv

我知道我们在c ++中使用该函数的方式如下

function declaration // before main

function calling    // in main

function definition // outside main

但是当我在项目中使用opencv时,我也在其中使用了函数,但我没有在其中使用函数声明并且它没有任何错误地工作正常,我使用相同的工具,相同的语言相同的技术。为什么函数声明在opencv中不是强制性的?还是以其他方式完成?

示例代码:

void generateGradient(cv::Mat& mask)
{
    cv::Point firstPt = cv::Point(mask.size().width/2, mask.size().height/2);
    double radius = 1.0;
    double power = 0.8;

    double maxImageRad = radius * getMaxDisFromCorners(mask.size(), firstPt);

    mask.setTo(cv::Scalar(1));
    for (int i = 0; i < mask.rows; i++)
    {
        for (int j = 0; j < mask.cols; j++)
        {
            double temp = dist(firstPt, cv::Point(j, i)) / maxImageRad;
            temp = temp * power;
            double temp_s = pow(cos(temp), 4);
            mask.at<double>(i, j) = temp_s;
        }
    }
}

    int main()
    {
        cv::Mat img = cv::imread("stack-exchange-chefs.jpg");
        cv::Mat maskImg(img.size(), CV_64F);
        generateGradient(maskImg);
    }

谢谢

3 个答案:

答案 0 :(得分:4)

规则是(宽松地):

  1. 以前必须先声明一个函数声明才能调用它。

  2. 该功能的定义必须存在于项目的某个位置。

  3. 您提供的示例符合这些规则。这样做:

    function definition
    
    function calling
    

    因为定义声明。

    我们希望将代码拆分为不同的文件。项目中的每个.cpp文件都是单独编译的,然后链接在一起。编译文件并且找不到函数的定义是可以的,只要链接阶段稍后找到该定义。

    这就是C ++程序的基本结构如何工作。例如,您可能包含文件main.cppA.cpp,其中包含A.h。在main.cpp内,我们使用的函数在A.h中声明并在A.cpp中定义。即使单独编译main.cppA.cpp,也会在最后将两者链接在一起时找到main.cpp使用的函数的定义。 main.cpp只需要声明该函数,该函数在A.h中给出。

    有可能,你要包含OpenCV的标题。这就像在前面的例子中包含A.h一样。它为您提供了一些您可能想要使用的函数声明。然后,您不需要自己编写声明,因为它是由标题提供的。该函数的实际定义已经编译,可以在OpenCV库中找到,您可以在编译程序时链接到该库。

    也就是说,您的文件如下所示:

    #include <opencv/some_header>
    
    function calling
    

    如果你预处理了这个文件,你就会把标题的内容带进去,它看起来像这样:

    function declaration
    
    function calling
    

    这很好。然后从库中链接函数定义。

答案 1 :(得分:0)

理论上至少是函数签名声明在调用时应该可用,因为编译器想要知道函数的签名。

这就是我们将头文件包含到cpp / c文件的原因。除了include之外,编译器无法识别函数签名,也无法在编译中检测cpp / c文件中的任何编译器错误。

答案 2 :(得分:0)

在C ++中,函数声明是必需的,因为重载等语言功能依赖于它。