我的程序非常简单,但我无法理解为什么会收到此错误消息。
这是我的代码:
#include<stdio.h>
int main( ){
TriangularNumber();
}
//gets a range of numbers as input and prints all triangular numbers in range.
void TriangularNumber(){
int left,right,tempSquare;
scanf("%d", &left);
scanf("%d", &right);
for(int i=left;i<=right;i++){
tempSquare = 8*i + 1;
for(int j = 0;j<=tempSquare;j++){
if(tempSquare = j*j){
printf("%d is a triangular number",tempSquare);
}
}
}
这是我编译时的错误消息:
ex2.c:10错误:重新定义&#39; TriangularNumber&#39;
的不兼容类型
我只是想让void函数做她的事情,我做了一个有很多完全不同的任务的任务,我希望它们分开而不是一个凌乱的主要方法。
答案 0 :(得分:3)
在旧版本的C中,如果编译器在看到该函数的声明或定义之前看到函数调用,它将假定该函数返回int
。所以发生了什么:
int main()
{
TriangularNumber( ); // no declaration or definition visible before this,
// compiler assumes TriangularNumber returns int
// (i.e., TriangularNumber is *implicitly* declared
// to return int)
...
}
void TriangularNumber( ) // Definition of TriangularNumber has different
{ // return type from the *implied* declaration
// above, compiler gets upset because the types
// don't match.
从C99开始,情况不再如此 - 不再允许隐式int
。在C99编译器下,你会得到一个不同的错误&#34; TriangularNumber在使用之前没有声明&#34;。
在调用函数之前,函数声明必须可见。函数定义也可以作为声明,因此解决此问题的最简单方法是在TriangularNumber
之前移动main
的定义:
void TriangularNumber( void )
{
...
}
int main( void )
{
TriangularNumber( );
...
}
如果在单独的源文件中定义TriangularNumber
,那么您将无法执行此操作;在main
调用之前,您需要在某处单独声明。您通常会设置一个单独的头文件,其中包含任何声明:
/**
* t.h - header file for TriangularNumber module
*/
#ifndef T_H
#define T_H
void TriangularNumber( void );
#endif
/**
* t.c - implementation file for TriangularNumber module
*/
#include "t.h" // include the declaration; in case we've made a mistake
// and have a mismatch between the declaration and definition,
// we can catch that here as the compiler will yell at us
void TriangularNumber( void )
{
...
}
/**
* main.c - source file that needs to use TriangularNumber module
*/
#include "t.h" // makes sure declaration for TriangularNumber is visible
int main( void )
{
TriangularNumber( );
...
}
答案 1 :(得分:1)
尝试:
#include<stdio.h>
void TriangularNumber();
int main( ){
TriangularNumber();
}
//gets a range of numbers as input and prints all triangular numbers in
void TriangularNumber(){
int left,right,tempSquare;
scanf("%d", &left);
scanf("%d", &right);
for(int i=left;i<=right;i++){
tempSquare = 8*i + 1;
for(int j = 0;j<=tempSquare;j++){
if(tempSquare == j*j){
printf("%d is a triangular number\n",tempSquare);
}
}
}
}