C函数中未声明的标识符

时间:2013-11-28 13:07:41

标签: c stack-overflow

当我编译以下C函数/程序时,我得到"missing ';' before 'type' 'remainder' : undeclared identifier"之类的错误 - 这个函数出了什么问题?

#include <stdio.h>

void conversionTo(int number,int base) {
  if(number==0)
    return;

  int remainder=number%base;    
  conversionTo((number/base),base);
  if(remainder<10)
    printf("%c",'0'+remainder);
  else
    printf("%c",'a'-10+remainder);
}   


int main() {
    conversionTo(int number,int base);
    return 0;
}

8 个答案:

答案 0 :(得分:3)

我不是C专家,但从很久以前的经验来看,我相信你不能在函数中间声明变量。

此外,还不清楚你要对函数/打印语句做什么。

试试这个:

#include <stdio.h>

void conversionTo(int number,int base) {
  int remainder=number%base;
  if(number==0)
    return;    

  conversionTo((number/base),base);
  if(remainder<10)
    printf("%c",'0'+ remainder); // Through the way ASCII works that gives the ASCII rep
                                 // of the remainder.
  else
    printf("%c",'a'-10+remainder); // Hex digits (A-F).
}   


int main() {
    conversionTo(/*Any number here*/10, /*any base number here*/2);
    return 0;
}

答案 1 :(得分:2)

您需要定义变量,然后才能使用它们。 所以这个:

int main() {
  conversionTo(int number,int base);
  return 0;
}

应该成为这个:

int main(void) 
{
  int number;
  int base:

  number = 47;
  base = 11;

  conversionTo(number, base);

  return 0;
}

非C99兼容编译器也不喜欢在上下文中间声明变量:

void conversionTo(int number,int base) {
  if(number==0)
    return;

  int remainder=number%base;    /* this would fail. */
  conversionTo((number/base),base);

要解决这个问题,请打开另一个背景:

void conversionTo(int number,int base) {
  if(number==0)
    return;

  {
    int remainder=number%base;    
    conversionTo((number/base),base);
    if(remainder<10)
      printf("%c",'0'+remainder);
    else
      printf("%c",'a'-10+remainder);
  }
}   

答案 2 :(得分:1)

你正在调用你的函数错误 - 以这种方式传递参数:

conversionTo(2,2);  // assuming you want to convert 2 to binary

int number = 123, base = 10;
conversionTo(number, base); // note this is not the same number and base as in the definition of your conversionTo function

完整代码:

#include <stdio.h>

void conversionTo(int number,int base)
{
     if(number==0)

                  return;
     int remainder=number%base;    
     conversionTo((number/base),base);
     if(remainder<10)
         printf("%c",'0'+remainder);
     else
         printf("%c",'a'-10+remainder);
}   

int main()
{

    conversionTo(2,2); // assuming you want to convert 2 to binary
    return 0;

}

使用功能时有三件事:

  

函数声明/原型 - 函数的原型是:

void conversionTo(int ,int );
  

功能定义:

void conversionTo(int number,int base /* Parameter list*/) 
{
    // your functionality
}
  

将函数传递给函数的函数调用:

conversionTo(2,2);

声明conversionTo(int number,int base);只是重新声明它。试试这个,即使这将编译:

int main()
{
    printf("Hello World");
    int main();
}

答案 3 :(得分:1)

您必须使用值或变量调用函数,而不是声明:

conversionTo(123, 10); // using constant value

int number = 123, base = 10; // variable declaration
conversionTo(number, base);  // using variable

答案 4 :(得分:1)

conversionTo(int number, int base)

是声明函数可以采用哪些参数的语法。要实际调用该函数,您需要省略该类型(假设您有相应名称的变量)

int number = 5;
int base = 10;

conversionTo(number, base); // <-- no int here!

或者您可以直接使用数字:

conversionTo(5, 10);

答案 5 :(得分:0)

函数声明number中的函数定义basevoid conversionTo(int number, int base)是传递给它的值在函数内部的名称。因此,如果您致电conversionTo(2,5),则会在函数内部看到2 number,而5将被视为base

如果你想使用变量而不是内容来调用函数,你可以这样做:

int main()
{
    int base = 2;
    int number = 5;
    conversionTo(base, number);
    return 0;
}

在这个令人困惑的例子中,变量basevalue分别具有值2和5。但是当你将它们传递给函数时,它内部的值将是number = 2和base = 5.这表明这些变量实际上是不同的,尽管名称相同。

答案 6 :(得分:0)

您应该使用$ CC -std = c99进行编译,以便在块中间声明变量。

(参见规范6.8节)

答案 7 :(得分:0)

声明“int remainder”必须在块中的任何语句之前。 声明可能有一个初始化器,就像你在这里一样。

你可以这样做:

    void conversionTo(int number,int base) {
      if (number > 0) {
        int remainder...
      }
    }

因为该功能不适用于负数。

修复例程中的其他错误:

    void conversionTo(int number,int base)
    {
      if(number>=0&&base>0&&base<=36)
      {
        int remainder=number%base;    
        number/=base;
        if(number>0)conversionTo(number,base);
        printf("%c",(remainder<10)?'0'+remainder:'a'+remainder-10);
      }
    }

如果数字为零,则会打印0,如果需要,只会递归。