函数参数列表后的变量声明

时间:2013-08-01 12:37:23

标签: c function syntax declaration

我对一个C代码进行了解释,其中变量似乎是在函数的参数列表之后声明的。我不知道这是可能的。

在代码中,int rint *aarr2int的参数列表后面声明。这对a的局部变量rarr2int有何影响?

我想了解代码的实际原因是因为如果a[1] = 1被称为第一次,我会在//MARKER的Linux x86 arr2int上运行它。

但是,如果我让它在基于ARM的omap4开发板a[1]=0上运行,我不知道为什么会有区别。

有人可以对此发表评论吗?

long arr2int(a,r)
int r;
int *a;
{
   int i;
   long mul, result = 0, temp;

   //MARKER
   for (i=1; i<=r; i++) {
      mul = 1;
      temp = a[i]-1;
      while (temp--)
         mul = mul << 1;
      result += mul;
   }
   return(result);
}

调用方法:

void generateEncodingTable(){
    register int i,j;
    long temp;
    int seed = 133757;

    printf("\n[I] - Generating Encoding Table\n");
    for (pattern = 0; pattern < 4096; pattern++) {
        temp = pattern << 11;          /* multiply information by X^{11} */
        encoding_table[pattern] = temp + get_syndrome(temp);/* add redundancy */
    }

    decoding_table[0] = 0;
    decoding_table[1] = 1;
    temp = 1; 
    for (i=2; i<= 23; i++) {
        temp *= 2;
        decoding_table[get_syndrome(temp)] = temp;
    }

    a[1] = 1; a[2] = 2;

    temp = arr2int(a,2);
    decoding_table[get_syndrome(temp)] = temp;
    for (i=1; i<253; i++) {
        nextcomb(23,2,a);
        temp = arr2int(a,2);
    decoding_table[get_syndrome(temp)] = temp;
    }

    a[1] = 1; a[2] = 2; a[3] = 3;
    temp = arr2int(a,3);
    decoding_table[get_syndrome(temp)] = temp;
    for (i=1; i<1771; i++) {
        nextcomb(23,3,a);
        temp = arr2int(a,3);
        decoding_table[get_syndrome(temp)] = temp;
    }
}

5 个答案:

答案 0 :(得分:4)

这是一种称为K&amp; K的旧记谱法。 R(Kernighan&amp; Ritchie,继Brian Kernighan和Dennis Ritchie之后)用于声明功能的符号。如果您的编译器支持它,您可以使用它,它与使用ANSI表示法声明函数相同。

答案 1 :(得分:4)

正如其他人所说,这是一种早期的功能编码方式。

以下是这种风格的陷阱。 请注意,传递的参数没有类型检查。 可能解释您的运行时间差异。

说你声明一个函数

int foo(a,b,c);

所有编译器在那一点看到的是一个名为“foo”的函数,它带有3个参数和 返回int。因此,使用检查仅限于此。

我们假设sizeof(short)&lt; sizeof(int)&lt; sizeof(long),函数定义为

int foo(a,b,c)
  int a;
  long b;
  int c;
{ /* code body */ }

请注意foo

的以下用法
int d,e,f;
d = foo(1,2L,3);
e = foo((short)1,2L,3);
f = foo(1,2,3);

第一个用法正常,正确的大小整数传递给foo 第二次使用也很好。在调用之前,第一个参数会提升为int大小,就像printf("%d", (short)2)在传递给(short)2之前将int提升为printf()一样。 第三个是一个问题,因为编译器不知道第二个参数需要是long。因此,传递给foo的数据未正确传递。 - &GT; UB

答案 2 :(得分:2)

这是一种旧的C语法。如果您的编译器可以吞下它,那么它应该像您以正常的ANSI方式声明函数一样工作。

答案 3 :(得分:2)

这是K&amp; R C,即由Brian Kernighan和Dennis Ritchie编写的第一版 The C Programming Language 所描述的C语言。第二版已转向ANSI C(C89)。

你总是使用ANSI C风格:

Rationale for International Standard - Programming Languages C 6.11.6函数声明符

  

描述使用“旧式”函数声明和过时的过时   定义,即不使用原型的传统风格,表明委员会的意图是新的原型风格最终应取代旧风格。

     

这种情况的要点是新语法解决了K&amp; R中定义的语言的一些最明显的缺点,即新风格在每一个方面都优于旧风格。

答案 4 :(得分:0)

这只是声明函数参数类型的一种方式:

void func (first_param, second_param)
int first_param;
int second_param;
{
 // ...
}

等于

void func (int first_param, int second_param)
{
 // ...
}