尝试在main中调用void函数时为什么不兼容类型

时间:2016-12-08 18:35:12

标签: c

我的程序非常简单,但我无法理解为什么会收到此错误消息。

这是我的代码:

#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函数做她的事情,我做了一个有很多完全不同的任务的任务,我希望它们分开而不是一个凌乱的主要方法。

2 个答案:

答案 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);
            }                
        }
    }
}