"Variable was not declared in this scope" 在 C 和 C++ 中
"Variable was not declared in this scope" in C and C++
我今天发现了 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
。如果我在文件 main.cpp
中放置声明 int sum(int, int)
,则不会发生错误。为什么 C 和 C++ 之间存在如此大的差异?解决它的最佳方法是什么?
这是 C++ 引入的一项功能:除非您确实看过声明或定义,否则不要假设您知道函数签名。更容易在编译器和 link 过程中更早地报告不正确的函数使用情况,并且使用 C++ 名称修饰需要确切的参数类型来知道代码需要针对哪个符号进行 linked -类型确定基于与候选者的匹配,具有各种可能的标准转换/隐式构造/隐式转换。
解决这个问题的正确方法是创建一个 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("%d\n", c);
return 0;
}
我今天发现了 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
。如果我在文件 main.cpp
中放置声明 int sum(int, int)
,则不会发生错误。为什么 C 和 C++ 之间存在如此大的差异?解决它的最佳方法是什么?
这是 C++ 引入的一项功能:除非您确实看过声明或定义,否则不要假设您知道函数签名。更容易在编译器和 link 过程中更早地报告不正确的函数使用情况,并且使用 C++ 名称修饰需要确切的参数类型来知道代码需要针对哪个符号进行 linked -类型确定基于与候选者的匹配,具有各种可能的标准转换/隐式构造/隐式转换。
解决这个问题的正确方法是创建一个 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("%d\n", c);
return 0;
}