main()在第一位C

时间:2015-01-04 12:26:58

标签: c main

所以我编写了这段代码,我想问一下,在其他事情发生之前,是否有可能首先编写main?

#include <stdio.h>              // Standard Ein-/Ausgabefunktionen
#include <at89c51cc03.h>        // CC03er-Grundregister




#define CS_LCD  0xffb8

xdata unsigned char eak_io @0xff80;
xdata unsigned char DIS_IR_W @CS_LCD+0x0;
xdata unsigned char DIS_DR_W @CS_LCD+0x1;
xdata unsigned char DIS_IR_R @CS_LCD+0x2;
xdata unsigned char DIS_DR_D @CS_LCD+0x3;




void init_schnittstelle(void)
{
    SCON=0x52;                  // Initialisierung
    TMOD |=0x20;                // Timermodus 8-bit auto-reload
    TH1=0xfa;                   // 4800 Baud
    TR1=1;                  
}


void ms_warten(unsigned int multiplikator)
{
    unsigned int i,j;
    for(i=0;i<multiplikator;i++)
    {
        for(j=0;j<123;j++);
    }
}


void dis_ready(void)        
{
    while ((DIS_IR_R & 0x80)!=0);   
}



void init_lcd(void)         
{
    unsigned char i;

    for (i=0; i<=2; i++)
      {
        DIS_IR_W=0x30;
        ms_warten(10);
      }

    // Function Set: DL=1, N=1, F=0
    dis_ready();                  
    DIS_IR_W=0x38;

    // Display ON/OFF: D=1, C=1, B=0
    dis_ready();                   
    DIS_IR_W=0x0c;

    // Entry Mode Set: I/D=1, S=0
    dis_ready();                    
    DIS_IR_W=0x06;
}


void dis_clear(void)
{
    dis_ready();               
    DIS_IR_W=0x01;            
}


void dis_csr_set(unsigned char z, unsigned char s)
{
    unsigned char csr_pos;
    switch (z)                    
      {
        case 0 : csr_pos=s;         
             break;
        case 1 : csr_pos=s+0x40;   
             break;
        case 2 : csr_pos=s+0x14;  
             break;
        case 3 : csr_pos=s+0x54;   
             break;       }
    dis_ready();                    
    DIS_IR_W=(csr_pos | 0x80);    
}

void dis_text(unsigned char csr, unsigned char z, unsigned char s, char *a)
{
    unsigned char i;
    if (csr==1) dis_csr_set(z,s);  
    i=0;                           
    while(a[i]!=0)
      {
        dis_ready();                    
        DIS_DR_W=a[i];             
        i++;                       
      }
}


void main(void)
{
    char aktuellerWert;          
    init_schnittstelle();         
    init_lcd();                     
    while(1)
    {
        RI = 0;                    
        while(!RI);                
        if(SBUF != aktuellerWert) 
        {
            aktuellerWert = SBUF;  
            switch(aktuellerWert)     
            {

                case 'O':   dis_clear();     
                            dis_text(1, 1, 2, "blabla");
                            dis_text(1, 2, 1, "blabla");
                            dis_text(1, 3, 3, "blabla");
                            break;

                case 'G':   dis_clear();       
                            dis_text(1, 1, 2, "blabla");
                            dis_text(1, 2, 1, "blabla");
                            break;
                case 'R':   dis_clear();      
                            dis_text(1, 1, 2, "blabla");
                            dis_text(1, 2, 1, "blabla");
                            break;
            }
        }
    }
}

所以我想在#define之前编写main方法,o它或多或少会在第一个位置。

谢谢!

2 个答案:

答案 0 :(得分:2)

编译器必须只知道在调用代码之前在代码中使用的函数。不需要函数的实际实现/定义,在调用之前只需要声明(函数原型)。这可以通过两种方式完成:

  1. 在头文件中。如果要在多个C文件中使用函数,请使用此方法。
  2. C源文件中的任何位置(最好在开头)。这些函数仅限于文件范围,即它们仅可用于声明它们的C源。
  3. 函数原型如下所示:

    return_type function_name(type_t param1, type_t param2);
    

    例如:

    int sum(int a, int b);
    

    将声明函数sum,告诉编译器

    1. 名为sum的函数存在于某处
    2. 该函数将两个整数作为参数
    3. 该函数返回一个整数。
    4. 此时,编译器不知道该函数是如何实现的。但是,由于编译器知道它存在并且它看起来像什么,它会很好地编译你的代码。

      以下是使用代码的简短示例:

      #include <stdio.h>              // Standard Ein-/Ausgabefunktionen
      #include <at89c51cc03.h>        // CC03er-Grundregister
      
      // Function prototypes for functions used in main() are here, now the compiler
      // is aware of them
      
      void init_schnittstelle(void); // Note the semicolon
      void init_lcd(void);
      
      // I didn't include the prototype for the function ms_warten(), since the main()
      // Doesn't use it directly. Declatring it beforehand wouldn't hurt, though.
      
      int main()
      {
           // Your code here
      }
      
      #define CS_LCD  0xffb8 // This isn't used by main() either, so the compiler 
                             // doesn't needto know about it before the
                             // main() fucntion.
      
      xdata unsigned char eak_io @0xff80;
      xdata unsigned char DIS_IR_W @CS_LCD+0x0;
      xdata unsigned char DIS_DR_W @CS_LCD+0x1;
      
      void init_schnittstelle(void)
      {
          // Your code here                 
      }
      
      
      void ms_warten(unsigned int multiplikator)
      {
          // Your code here
      }
      

答案 1 :(得分:0)

有一种称为函数声明。函数定义相反

int foo(int x)
{
    return x + 42;
}

告诉编译器函数是做什么的,函数声明告诉编译器如何调用函数。这将是foo的有效函数声明:

int foo(int x);

注意缺少括号和尾随分号。声明一个函数就足以让编译器知道如何调用它。因此,如果您预先声明main()调用的所有函数,则可以先定义main函数。以下是可能的示例:

void init_schnittstelle(void);
void ms_warten(unsigned int multiplikator);
void dis_ready(void);
void init_lcd(void);
void dis_clear(void);
void dis_csr_set(unsigned char z, unsigned char s);
void dis_text(unsigned char csr, unsigned char z, unsigned char s, char *a);

void main(void)
{
    /* Code hier */
}

程序中事物的习惯顺序是:

  1. 功能测试宏
  2. #include指令
  3. #define指令
  4. 类型和枚举声明
  5. 功能声明
  6. 变量定义
  7. 功能定义
  8. 请注意,在定义main()之前有很多内容,但您仍然可以将main()定义为第一个函数。