第2天 棧和寄存器


第2天 棧和寄存器

多文件編程

筆者在私下和很多C語言的愛好者和初學者交流的過程中發現,大家已經能夠使用C語言做出來很出色的程序了。但是這些出色的程序中的一部分竟然只有一個源文件。所以,筆者決定要介紹一下如何使用多個源文件進行編程。不得不說,多文件編程有非常多的優勢。比如在維護上非常方便,同時也給多人合作提供了便利。當然,筆者我最喜歡多文件編程的一點就是因為它看起來舒服。接下來,我們就一起來學習如何進行多文件編程。

進入DEV-C++集成開發環境之后,在頂部菜單中找到“文件”→“新建”→“項目”。在彈出的對話框中選擇"空項目"(Empty Project),注意還需要選擇開發的語言並給項目起名。點擊確定后需要對工程文件進行保存。

圖

之后請在左側的項目管理中找到剛剛新建的項目,新建的項目默認有一個源代碼文件,請將它移除並在項目中添加我們在昨天編寫的源文件。

圖

接下來我們需要在我們的項目中新建一個源文件,並把它命名為 kia_style.h 實際上它是一個頭文件。這樣我們就可以把我們之前編寫的除了最基本框架的部分都扔到 kia_style.h 這個頭文件中。於是 kia_style.h 就變成了:

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>

#ifndef KIA_STYLE_H
#define KIA_STYLE_H

unsigned short kia_fc=7;
unsigned short kia_bc=0;

void kia_refreshcolor() {
	HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hCon,(kia_fc%16)|(kia_bc%16*16));
}

void kia_color(unsigned short c) {
	kia_fc=c;
	kia_refreshcolor();
}

void kia_out(char *str) {
	unsigned short kia_sfc=kia_fc;
	if(strcmp(str,"none")==0)
		kia_color(7);
	printf("%s",str);
	kia_color(kia_sfc);
}

void kia_outln(char *str) {
	unsigned short kia_sfc=kia_fc;
	if(strcmp(str,"none")==0)
		kia_color(7);
	printf("%s\n",str);
	kia_color(kia_sfc);
}

void kia_limout(unsigned char lim,char *str,char style) {
	unsigned char i=0,j=0,len=strlen(str);
	if(len<=lim) {
		kia_out(str);
		for(i=0; i<(lim-len); i++)
			kia_out(" ");
		if(style!=0)
			kia_outln("");
	}
	if(len>lim) {
		if(style==0) {
			for(i=0; i<(lim-3); i++)
				printf("%c",str[i]);
			kia_out("...");
		} else {
			while((j*lim+i)<len) {
				for(i=0; i<lim; i++) {
					printf("%c",str[j*lim+i]);
					if((j*lim+i)>=len)
						break;
				}
				if(style==abs(style))
					printf("\n");
				if((j*lim+i)<len)
					for(i=0; i<abs(style); i++)
						printf(" ");
				j++;
			}
			if(style!=abs(style))
				printf("\n");
		}
	}
}

void kia_tag(char *str) {
	strlwr(str);
	if(strcmp(str,"tip")==0) {
		kia_color(10);
		kia_limout(10,"tip",0);
	} else if(strcmp(str,"error")==0) {
		kia_color(12);
		kia_limout(10,"error",0);
	} else if(strcmp(str,"warning")==0) {
		kia_color(13);
		kia_limout(10,"warning",0);
	} else {
		kia_color(11);
		kia_limout(10,str,0);
		kia_color(14);
	}
}

#endif

這樣一來,主文件就會變得非常的簡單清爽。按照筆者的習慣,主文件被命名為 main.c

#include "kia_style.h"

int kia_end() {
	kia_tag("tip");
	kia_limout(69,"Press any key to return.",10);
	getch();
	kia_fc=7;
	kia_bc=0;
	kia_refreshcolor();
	return 0;
}

int main(int argc, char *argv[]) {
	SetConsoleTitle("kiasm virtual machine");
	kia_tag("tip");
	kia_limout(69,"test-00000-test-11111-test-22222-test-33333-test-44444-test-55555-test-66666-test",10);
	kia_tag("error");
	kia_limout(69,"test-00000-test-11111-test-22222-test-33333-test",10);
	kia_tag("warning");
	kia_limout(69,"test-00000-test-11111-test-22222-test-33333-test",10);
	kia_tag("test");
	kia_limout(69,"test-00000-test-11111-test-22222-test-33333-test",10);
	kia_tag("testtesttest");
	kia_limout(69,"none",10);
	return kia_end();
}

這里有兩件事需要引起特別的注意。首先在 kia_style.h 頭文件中

#ifndef KIA_STYLE_H
#define KIA_STYLE_H

//省略程序塊

#endif

這里#ifndef#define#endif都是預處理命令,它們的作用是避免頭文件中的函數和變量被重復聲明。

其次,在主文件中只需要包括一個 kia_style.h 頭文件,因為主函數沒有直接調用其他的頭文件,在kia_style.h 頭文件中調用的其他頭文件應當在kia_style.h 頭文件中包含,而不是在主文件中包含。另外值得注意的是,由於 kia_style.h 頭文件是我們自行開發的頭文件,所以它要被雙引號包裹,而不是被尖括號包裹。

現在可以點擊編譯並運行試試看,是不是得到了和昨天一模一樣的結果。

無類型語言的建立

雖然說在那些已經非常健壯的編程語言中無類型語言已經是過去時了。但是如果我們一開始就建立一種有類型語言的話,似乎會給我們制造編程語言的歷程帶來很多額外的負擔。所以,暫時來說筆者還是要建立一種無類型的語言,在后續的章節中我會告訴你,有類型語言是如何實現的。

所謂無類型語言並不是說一種數據類型都沒有的語言,它只有一種數據類型。這種數據類型可以根據大家的喜好來決定。筆者最喜歡的類型是無符號的字符型,即 unsigned char 。選擇這種類型作為無類型語言的唯一的數據類型的原因就是它很容易就能變成其他的類型。為我們后續創造有類型的編程語言提供了極大的便利。如果每一次都要寫 unsigned char 來定義這種數據類型未免太過於麻煩了。所以我們使用 typedefunsigned char 起一個別名供我們使用。這里筆者起的名字是 kia_t

typedef unsigned char kia_t;

預知后事如何,請聽下回分解。關注我,第一時間獲得更新動態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM