Latest web development tutorials

C preprocessor

Bagian dariC preprocessor tidak compiler, tetapi adalah proses menyusun langkah terpisah.Singkatnya, C preprocessor hanyalah alat substitusi teks saja, mereka akan menginstruksikan compiler untuk mengkompilasi pretreatment lengkap sebelum kebutuhan yang sebenarnya. Kami akan C preprocessor (C Preprocessor) disingkat CPP.

Semua pesanan pra-prosesor dengan tanda pagar (#) di awal. Ini harus menjadi karakter non-kosong pertama, dalam rangka untuk meningkatkan keterbacaan, preprocessor arahan harus dimulai pada kolom pertama. Di bawah ini adalah semua instruksi pra-prosesor yang penting:

指令描述
#define定义宏
#include包含一个源代码文件
#undef取消已定义的宏
#ifdef如果宏已经定义,则返回真
#ifndef如果宏没有定义,则返回真
#if如果给定条件为真,则编译下面代码
#else#if 的替代方案
#elif如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
#endif结束一个 #if……#else 条件编译块
#error当遇到标准错误时,输出错误消息
#pragma使用标准化方法,向编译器发布特殊的命令到编译器中

Contoh pra-prosesor

Analisis untuk memahami contoh-contoh berikut instruksi yang berbeda.

#define MAX_ARRAY_LENGTH 20

direktif ini menceritakan CPP untuk mengganti semua MAX_ARRAY_LENGTH 20. Gunakan#defineuntuk mendefinisikan konstanta untuk meningkatkan keterbacaan.

#include <stdio.h>
#include "myheader.h"

Instruksi ini memberitahu CPP stdio.h dapatkan dariperpustakaan sistem, dan menambahkan teks ke file sumber arus.Baris berikutnya mengatakan CPPmyheader.h dapatkan dari direktori lokal dan menambahkan konten ke file sumber arus.

#undef  FILE_SIZE
#define FILE_SIZE 42

Perintah ini memberitahu CPP membatalkan FILE_SIZE didefinisikan, dan mendefinisikannya sebagai 42.

#ifndef MESSAGE
   #define MESSAGE "You wish!"
#endif

Perintah ini memberitahu CPP hanya ketika PESAN terdefinisi hanya jika didefinisikan PESAN.

#ifdef DEBUG
   /* Your debugging statements here */
#endif

Perintah ini memberitahu CPP jika anda menentukan DEBUG, kemudian melakukan pernyataan pengolahan. Pada waktu kompilasi, jika Anda lulus-DDEBUGberalih ke compiler gcc, perintah ini berguna. Mendefinisikan DEBUG, Anda selalu dapat mengaktifkan atau mematikan debugging selama kompilasi.

makro yang telah ditetapkan

ANSI C mendefinisikan sejumlah macro. Dalam pemrograman, Anda dapat menggunakan macro ini, namun berbeda untuk langsung mengubah ini makro yang telah ditetapkan.

描述
__DATE__当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。
__TIME__当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。
__FILE__这会包含当前文件名,一个字符串常量。
__LINE__这会包含当前行号,一个十进制常量。
__STDC__当编译器以 ANSI 标准编译时,则定义为 1。

Mari kita coba contoh berikut:

#include <stdio.h>

main()
{
   printf("File :%s\n", __FILE__ );
   printf("Date :%s\n", __DATE__ );
   printf("Time :%s\n", __TIME__ );
   printf("Line :%d\n", __LINE__ );
   printf("ANSI :%d\n", __STDC__ );

}

Ketika kode di atas (ditest.c file) yang disusun dan dilaksanakan, menghasilkan hasil sebagai berikut:

File :test.c
Date :Jun 2 2012
Time :03:36:24
Line :8
ANSI :1

Operator preprocessor

C preprocessor memberikan operator berikut untuk membantu Anda membuat makro:

Kelanjutan operator makro (\)

Sebuah makro biasanya ditulis pada satu baris. Namun, jika makro terlalu panjang untuk muat dalam satu baris, menggunakan kelanjutan operator makro (\). Sebagai contoh:

#define  message_for(a, b)  \
    printf(#a " and " #b ": We love you!\n")

string literal kuantisasi operator (#)

Dalam definisi makro, ketika Anda harus menempatkan argumen makro menjadi string konstan, string konstan kuantisasi operator (#). Makro menggunakan operator memiliki parameter atau parameter daftar tertentu. Sebagai contoh:

#include <stdio.h>

#define  message_for(a, b)  \
    printf(#a " and " #b ": We love you!\n")

int main(void)
{
   message_for(Carole, Debra);
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

Carole and Debra: We love you!
paste Operator Token (##)

Operator paste Token (##) dalam definisi makro akan menggabungkan dua parameter. Hal ini memungkinkan dua tag definisi makro independen digabungkan menjadi tag. Sebagai contoh:

#include <stdio.h>

#define tokenpaster(n) printf ("token" #n " = %d", token##n)

int main(void)
{
   int token34 = 40;
   
   tokenpaster(34);
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

token34 = 40

Ini adalah bagaimana hal itu terjadi, karena contoh ini akan menghasilkan output yang sebenarnya berikut dari compiler:

printf ("token34 = %d", token34);

Contoh ini menunjukkan token ## n menghubungkan ke token34 di sini, kami menggunakanstring konstan Operator kuantisasi (#), dan operator paste tanda (##).

didefinisikan () Operator

Operator preprocessordidefinisikan digunakan dalam ekspresi konstan digunakan untuk menentukan apakah sebuah identifier telah didefinisikan menggunakan #define tersebut.Jika identifier yang ditentukan sudah didefinisikan, nilai benar (bukan nol). Jika identifier yang ditentukan tidak didefinisikan, nilai adalah palsu (nol). Contoh berikut menggambarkan () penggunaan operator didefinisikan:

#include <stdio.h>

#if !defined (MESSAGE)
   #define MESSAGE "You wish!"
#endif

int main(void)
{
   printf("Here is the message: %s\n", MESSAGE);  
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

Here is the message: You wish!

makro parameter

CPP adalah fitur kuat dapat digunakan untuk mensimulasikan fungsi makro parameter. Misalnya, kode berikut adalah untuk menghitung kuadrat dari angka:

int square(int x) {
   return x * x;
}

Kita dapat menggunakan makro untuk menulis ulang kode di atas, sebagai berikut:

#define square(x) ((x) * (x))

Sebelum menggunakan macro dengan parameter, Anda harus menggunakandirektif # define.daftar parameter dalam tanda kurung, dan harus segera balik nama makro. Sebuah ruang antara nama makro dan kurung kiri tidak diperbolehkan. Sebagai contoh:

#include <stdio.h>

#define MAX(x,y) ((x) > (y) ? (x) : (y))

int main(void)
{
   printf("Max between 20 and 10 is %d\n", MAX(10, 20));  
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

Max between 20 and 10 is 20