C语言 main函数和变量

laik7k3q  于 2023-04-19  发布在  其他
关注(0)|答案(1)|浏览(133)

我看到main()函数的一个特殊定义,不知道它是怎么定义的,以前没见过这种风格。

main (m1,s) char *s; 
{
}

我不明白这种定义函数的方式。

代码完整

#include "stdio.h"
#define e 3
#define g (e/e)
#define h ((g+e)/2)
#define f (e-g-h)
#define j (e*e-g)
#define k (j-h)
#define l(x) tab2[x]/h
#define m(n,a) ((n&(a))==(a)) //if n==a then the m(n,a)==1 else m(n,a)==0

long tab1[]={ 989L, 5L, 26L, 0L, 88319L, 123L, 0L, 9367L }; //L means It is a long integer literal.
int tab2[] = { 4,6,10,14,22,26,34,38,46,58,62,74,82,86};
main (m1,s) char *s; {
    int a,b,c,d,o[k],n = (int)s;
    if (m1==1){char b[2*j+f-g]; main (l(h+e)+h+e,b); printf(b);}
    else switch (m1-=h){
        case f:
            a = (b=(c=(d=g)<<g)<<g)<<g;
            return(m(n,a|c)|m(n,b)|m(n,a|d)|m(n,c|d));
        case h:
            for (a=f;a<j;++a)if(tab1[a]&&!(tab1[a]%((long)l(n))))return(a);
        case g:
            if(n<h)return(g);
            if (n<j){n-=g;c='D';o[f]=h;o[g]=f;}
            else {c='\r'-'\b';n-=j-g;o[f]=o[g]=g;}
            if ((b=n)>=e)for (b=g<<g;b<n;++b)o[b]=o[b-h]+o[b-g]+c;
            return (o[b-g]%n+k-h);
        default:
            if (m1-=e) main (m1-g+e+h, s+g); else * (s+g)=f;
            for (*s=a=f; a<e;) *s=(*s<<e)|main(h+a++,(char *)m1);
    }
    }
fcg9iug3

fcg9iug31#

这是K&R C风格。早于ANSI和ISO C89。
公司简介(和C89)使用隐式int,如果没有给出类型,则隐式int,因此在您的示例中,m1具有类型int。在K&R C中,参数的类型在后面给出,在您的示例中,参数s被声明为char *。隐式int也用于返回类型,所以如果一个函数定义没有给出返回类型,它就是int,就像你的main函数一样。
这就为您的main()函数提供了原型int main(int m1, char *s);。不需要参数(int main (void);)或带有指向char的指针数组的int或等效值(int main (int, char **);)。POSIX也接受int main (int, char **, char **);。大多数独立的环境通常需要int main(void);void main(void);。您的原型不符合任何这些(也不是我所知道的任何其他的),而且似乎是错误的。它用在哪里?
标签:Alternative (K&R) C syntax for function declaration versus prototypes

编辑

在看到它来自混淆的代码后,它只打印"hallo world!\n",并且不接受参数:main的原型int main(int m1, char *s);在ISO C或我所知道的任何其他C环境中都不是标准的。当你传递太多参数时,程序会中断。然而,当没有参数时,char *s参数只在从程序内部调用时使用,然后类型char *工作。这不是好的做法(恰恰相反,但我猜这是目标)。

相关问题