"Variable was not declared in this scope" C 和 C++ 语言

"Variable was not declared in this scope" in C and C++

本文关键字:C++ 语言 scope in Variable was not declared this      更新时间:2023-10-16

我发现今天C和C++之间有区别。我把程序分为两个不同的文件,这是我的C测试:

/* in file main.c*/
#include <stdio.h>
int main()
{
    int a = 3, b = 4;
    int c = sum(a, b);
    printf("%dn", 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。如果我在文件main.cpp中放入声明int sum(int, int),则不会发生错误。为什么C和C++之间有如此不同?解决问题的最佳方法是什么?

这是C++引入的一个特性:除非您实际看到了声明或定义,否则不要假设您知道函数签名。使得在编译器&链接过程,并且C++名称篡改参数的确切类型需要知道代码需要链接到哪个符号-类型的确定是基于与候选符号的匹配,可以使用各种标准转换/隐式构造/隐式强制转换。

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

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

这应该包含在第一行或sum.cpp中(因此,如果sum.h的内容演变为依赖于<iostream>的内容,但忘记了包含它本身,则会出现错误),并且在main.cpp中,根据您的喜好在其他内容之前或之后包含(我担心大多数人会放在后面,但这是一种风格选择)。

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

/* 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("%dn", c);
    return 0;
}