"变量未在此范围内声明"在C和C ++中

时间:2015-03-18 02:54:48

标签: c++ c compilation

我今天发现C和C ++之间存在差异。 我把程序分成两个不同的文件,这是我的C测试:

/* in file main.c*/
#include <stdio.h>

int main()
{
    int a = 3, b = 4;
    int c = sum(a, b);
    printf("%d\n", c);
}

/* In file sum.c */
#include <stdio.h>

int sum(int x, int y)
{
    return x + y;
}

然后,我编译了gcc main.c sum.c,没有错误,结果是正确的。以下是我的C ++测试,我还将它们分成两个不同的文件:

/* in file main.cpp*/
#include <iostream>

int main()
{
    int a = 3, b = 4;
    int c = sum(a, b);
    std::cout << c << std::endl;
}

/* In file sum.cpp */
#include <iostream>

int sum(int x, int y)
{
    return x + y;
}

编译他们g++ main.cpp sum.cpp。发生错误:error: ‘sum’ was not declared in this scope。如果我在文件int sum(int, int)中放置声明main.cpp,则不会发生错误。为什么C和C ++之间存在这样的差异?什么是最好的解决方法?

2 个答案:

答案 0 :(得分:7)

这是C ++引入的一个特性:除非你真的看过声明或定义,否则不要假设你知道函数签名。在编译器和文件中更容易报告不正确的函数使用情况。链接过程,并且使用C ++名称修改,需要确切的参数类型来知道代码需要链接的符号 - 类型确定基于与候选者的匹配,具有各种标准转换/隐式构造/隐式转换可能的。

解决此问题的正确方法是创建sum.h头文件:

#ifndef SUM_H
#define SUM_H
int sum(int, int);
#endif

这应该包含在第一行或sum.cpp中(如果sum.h内容演变为依赖<iostream>内容但忘记将其自身包含在内,则会出现错误,在main.cpp之前或之后的{{1}}包括你喜欢的东西(我担心大多数人会把它放在后面,但这是一种风格选择)。

答案 1 :(得分:0)

当然,创建h文件是最佳选择。但至少可以在sum之前加入main函数声明,例如:

/* in file main.c*/
#include <stdio.h>

// external function declaration (instead of h-file)
int sum(int, int);

int main()
{
    int a = 3, b = 4;
    int c = sum(a, b);
    printf("%d\n", c);
    return 0;
}