我今天发现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 ++之间存在这样的差异?什么是最好的解决方法?
答案 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;
}