国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語(yǔ)言中程序的編譯(預(yù)處理操作)+鏈接詳解(詳細(xì)介紹程序預(yù)編譯過(guò)程)

這篇具有很好參考價(jià)值的文章主要介紹了C語(yǔ)言中程序的編譯(預(yù)處理操作)+鏈接詳解(詳細(xì)介紹程序預(yù)編譯過(guò)程)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. 前言

今天我們來(lái)學(xué)習(xí)C語(yǔ)言中程序的編譯和鏈接是如何進(jìn)行的。
在ANSI C的任何一種實(shí)現(xiàn)中,存在兩個(gè)不同的環(huán)境。
第1種是翻譯環(huán)境,在這個(gè)環(huán)境中源代碼被轉(zhuǎn)換為可執(zhí)行的機(jī)器指令。 第2種是執(zhí)行環(huán)境,它用于實(shí)際執(zhí)行代碼。
本文主要是介紹預(yù)編譯階段的相關(guān)知識(shí)。

2. 翻譯環(huán)境和運(yùn)行環(huán)境

2.1 翻譯環(huán)境

1.組成一個(gè)程序的每個(gè)源文件通過(guò)編譯過(guò)程分別轉(zhuǎn)換成目標(biāo)代碼(object code)。
2.每個(gè)目標(biāo)文件由鏈接器(linker)捆綁在一起,形成一個(gè)單一而完整的可執(zhí)行程序。
3.鏈接器同時(shí)也會(huì)引入標(biāo)準(zhǔn)C函數(shù)庫(kù)中任何被該程序所用到的函數(shù),而且它可以搜索程序員個(gè)人的程序庫(kù),將其需要的函數(shù)也鏈接到程序中。

如下圖所示:
C語(yǔ)言中程序的編譯(預(yù)處理操作)+鏈接詳解(詳細(xì)介紹程序預(yù)編譯過(guò)程)

而編譯本身又分為三個(gè)階段 - 預(yù)編譯,編譯,匯編
預(yù)編譯(預(yù)處理) - 1.頭文件的包含,#include是預(yù)處理指令 2.#define定義符號(hào)的替換,#define是預(yù)處理指令 3.刪除注釋,最終生成.i文件
編譯 - 把c語(yǔ)言代碼翻譯成匯編代碼,1.語(yǔ)法分析 2.詞法分析 3.語(yǔ)義分析 4.符號(hào)匯總,最終生成.s文件
匯編 - 把匯編指令翻譯成二進(jìn)制的指令,形成符號(hào)表,最終生成.o文件
鏈接 - 1.合并段表 2.符號(hào)表的合并和重定位

2.2 運(yùn)行環(huán)境

程序執(zhí)行的過(guò)程:
1.程序必須載入內(nèi)存中。在有操作系統(tǒng)的環(huán)境中:一般這個(gè)由操作系統(tǒng)完成。
在獨(dú)立的環(huán)境中,程序的載入必須由手工安排,也可能是通過(guò)可執(zhí)行代碼置入只讀內(nèi)存來(lái)完成。
2.程序的執(zhí)行便開始。接著便調(diào)用main函數(shù)。
3.開始執(zhí)行程序代碼。這個(gè)時(shí)候程序?qū)⑹褂靡粋€(gè)運(yùn)行時(shí)堆棧(stack),存儲(chǔ)函數(shù)的局部變量和返回地址。程序同時(shí)也可以使用靜態(tài)(static)內(nèi)存,存儲(chǔ)于靜態(tài)內(nèi)存中的變量在程序的整個(gè)執(zhí)行過(guò)程一直保留他們的值。
4.終止程序。正常終止main函數(shù);也有可能是意外終止。

3. 預(yù)處理詳解

接下來(lái)主要介紹預(yù)處理階段的相關(guān)操作。

3.1 預(yù)定義符號(hào)

預(yù)定義符號(hào) - 這些預(yù)定義符號(hào)都是語(yǔ)言內(nèi)置的。
FILE 進(jìn)行編譯的源文件
LINE 文件當(dāng)前的行號(hào)
DATE 文件被編譯的日期
TIME 文件被編譯的時(shí)間
STDC 如果編譯器遵循ANSI C,其值為1,否則未定義

使用方法:

int main()
{
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("name:%s file:%s line:%d date:%s time:%s i=%d\n", __func__, __FILE__, __LINE__, __DATE__, __TIME__, i);
	}
	return 0;
}

C語(yǔ)言中程序的編譯(預(yù)處理操作)+鏈接詳解(詳細(xì)介紹程序預(yù)編譯過(guò)程)

3.2 #define定義的標(biāo)識(shí)符常量和宏

3.2.1 #define定義的標(biāo)識(shí)符常量

#define的語(yǔ)法是:#define name stuff
如:#define MAX 1000 #define reg register
如果定義的 stuff過(guò)長(zhǎng),可以分成幾行寫,除了最后一行外,每行的后面都加一個(gè)反斜杠(續(xù)行符)。

使用方法:

#define MAX 10
#define STR "abcdef"

int main()
{
	int n = MAX;
	char* str = STR;
	printf("%d\n", n);
	printf("%s\n", str);
	return 0;
}

C語(yǔ)言中程序的編譯(預(yù)處理操作)+鏈接詳解(詳細(xì)介紹程序預(yù)編譯過(guò)程)

3.2.2 #define定義的宏

#define 機(jī)制包括了一個(gè)規(guī)定,允許把參數(shù)替換到文本中,這種實(shí)現(xiàn)通常稱為宏(macro)或定義宏(definemacro)。
#define name( parament-list ) stuff
注意: 參數(shù)列表的左括號(hào)必須與name緊鄰。 如果兩者之間有任何空白存在,參數(shù)列表就會(huì)被解釋為stuff的一部分。
用于對(duì)數(shù)值表達(dá)式進(jìn)行求值的宏定義都應(yīng)該用這種方式加上括號(hào),避免在使用宏時(shí)由于參數(shù)中的操作符或鄰近操作符之間不可預(yù)料的相互作用。

使用方法:

#define ADD(x,y) ((x)+(y))
int main()
{
	int a = 10;
	int b = 20;
	int c = ADD(a, b);
	printf("%d\n", c);
	return 0;
}

C語(yǔ)言中程序的編譯(預(yù)處理操作)+鏈接詳解(詳細(xì)介紹程序預(yù)編譯過(guò)程)

3.2.3 #define替換規(guī)則

在程序中擴(kuò)展#define定義符號(hào)和宏時(shí),需要涉及幾個(gè)步驟。
1.在調(diào)用宏時(shí),首先對(duì)參數(shù)進(jìn)行檢查,看看是否包含任何由#define定義的符號(hào)。如果是,它們首先被替換。
2.替換文本隨后被插入到程序中原來(lái)文本的位置。對(duì)于宏,參數(shù)名被他們的值替換。
3.最后,再次對(duì)結(jié)果文件進(jìn)行掃描,看它是否包含任何由#define定義的符號(hào)。如果是,就重復(fù)上述處理過(guò)程。
注意:
1.宏參數(shù)和#define定義中可以出現(xiàn)其他#define定義的變量。但是對(duì)于宏,不能出現(xiàn)遞歸。
2.當(dāng)預(yù)處理器搜索#define定義的符號(hào)的時(shí)候,字符串常量的內(nèi)容并不被搜索。

3.2.4 #和##

使用 # ,把一個(gè)宏參數(shù)變成對(duì)應(yīng)的字符串
使用##,可以把位于##兩邊的符號(hào)合成一個(gè)符號(hào)。它允許宏定義從分離的文本片段創(chuàng)建標(biāo)識(shí)符。
注: 這樣的連接必須產(chǎn)生一個(gè)合法的標(biāo)識(shí)符。否則其結(jié)果就是未定義的。

使用方法:

#define PRINT(VALUE,FORMAT) printf("the value of " #VALUE " is " FORMAT "\n", VALUE);

int main()
{
	int a = 10;
	int b = 20;
	PRINT(a+b, "%d");
	return 0;
}

C語(yǔ)言中程序的編譯(預(yù)處理操作)+鏈接詳解(詳細(xì)介紹程序預(yù)編譯過(guò)程)

3.2.5 帶副作用的宏參數(shù)

當(dāng)宏參數(shù)在宏的定義中出現(xiàn)超過(guò)一次的時(shí)候,如果參數(shù)帶有副作用,那么你在使用這個(gè)宏的時(shí)候就可能出現(xiàn)危險(xiǎn),導(dǎo)致不可預(yù)測(cè)的后果。副作用就是表達(dá)式求值的時(shí)候出現(xiàn)的永久性效果。
例如:
x + 1;//不帶副作用
x++;//帶有副作用

例如如下代碼:

#define MAX(a,b) ((a) > (b) ? (a) : (b))

int main()
{
	int x = 5;
	int y = 8;
	int z = MAX(x++, y++);

	printf("%d %d %d\n", x, y, z);
	return 0;
}

結(jié)果是:
C語(yǔ)言中程序的編譯(預(yù)處理操作)+鏈接詳解(詳細(xì)介紹程序預(yù)編譯過(guò)程)

3.3 宏和函數(shù)的對(duì)比

優(yōu)點(diǎn):
1.用于調(diào)用函數(shù)和從函數(shù)返回的代碼可能比實(shí)際執(zhí)行這個(gè)小型計(jì)算工作所需要的時(shí)間更多。
所以宏比函數(shù)在程序的規(guī)模和速度方面更勝一籌。
2.更為重要的是函數(shù)的參數(shù)必須聲明為特定的類型。所以函數(shù)只能在類型合適的表達(dá)式上使用。
反之宏可以適用于整形、長(zhǎng)整型、浮點(diǎn)型等類型。宏是類型無(wú)關(guān)的。

缺點(diǎn):
1.每次使用宏的時(shí)候,一份宏定義的代碼將插入到程序中。除非宏比較短,否則可能大幅度增加程序的長(zhǎng)度。
2.宏是沒(méi)法調(diào)試的。
3.宏由于類型無(wú)關(guān),也就不夠嚴(yán)謹(jǐn)。
4.宏可能會(huì)帶來(lái)運(yùn)算符優(yōu)先級(jí)的問(wèn)題,導(dǎo)致程序容易出錯(cuò)。

以下是詳細(xì)對(duì)比:

代碼長(zhǎng)度:
#define定義的宏:每次使用時(shí),宏代碼都會(huì)被插入到程序中。除了非常小的宏之外,程序的長(zhǎng)度會(huì)大幅度增長(zhǎng)。
函數(shù):函數(shù)代碼只出現(xiàn)于一個(gè)地方;每次使用這個(gè)函數(shù)時(shí),都調(diào)用那個(gè)地方的同一份代碼。

執(zhí)行速度:
#define定義的宏:更快
函數(shù):存在函數(shù)的調(diào)用和返回的額外開銷,所以相對(duì)慢一些

操作符優(yōu)先級(jí):
#define定義的宏:宏參數(shù)的求值是在所有周圍表達(dá)式的上下文環(huán)境里,
除非加上括號(hào),否則鄰近操作符的優(yōu)先級(jí)可能會(huì)產(chǎn)生不可預(yù)料的后果,所以建議宏在書寫的時(shí)候多些括號(hào)。
函數(shù):函數(shù)參數(shù)只在函數(shù)調(diào)用的時(shí)候求值一次,它的結(jié)果值傳遞給函數(shù)。表達(dá)式的求值結(jié)果更容易預(yù)測(cè)。

帶有副作用的參數(shù):
#define定義的宏:參數(shù)可能被替換到宏體中的多個(gè)位置,所以帶有副作用的參數(shù)求值可能會(huì)產(chǎn)生不可預(yù)料的結(jié)果。
函數(shù):函數(shù)參數(shù)只在傳參的時(shí)候求值一次,結(jié)果更容易控制。

參數(shù)類型:
#define定義的宏:宏的參數(shù)與類型無(wú)關(guān),只要對(duì)參數(shù)的操作是合法的,它就可以使用于任何參數(shù)類型。
函數(shù):函數(shù)的參數(shù)是與類型有關(guān)的,如果參數(shù)的類型不同,就需要不同的函數(shù),即使他們執(zhí)行的任務(wù)是不同的。

調(diào)試:
#define定義的宏:宏是不方便調(diào)試的。
函數(shù):函數(shù)是可以逐語(yǔ)句調(diào)試的。

遞歸:
#define定義的宏:宏是不能遞歸的。
函數(shù):函數(shù)是可以遞歸的。

4. 條件編譯

在編譯一個(gè)程序的時(shí)候我們?nèi)绻獙⒁粭l語(yǔ)句(一組語(yǔ)句)編譯或者放棄是很方便的。因?yàn)槲覀冇袟l件編譯指令。

4.1 常見(jiàn)的條件編譯指令

1. 
#if 常量表達(dá)式
 ... 
#endif
//常量表達(dá)式由預(yù)處理器求值。

//2.多個(gè)分支的條件編譯
#if 常量表達(dá)式
... 
#elif 常量表達(dá)式
... 
#else
... 
#endif

//3.判斷是否被定義
#if defined(symbol)
#ifdef symbol

#if !defined(symbol)
#ifndef symbol

//4.嵌套指令
#if defined(OS_UNIX)
      #ifdef OPTION1
           unix_version_option1();
      #endif
      #ifdef OPTION2
           unix_version_option2();
      #endif
#elif defined(OS_MSDOS)
      #ifdef OPTION2
           msdos_version_option2();
      #endif
#endif

使用方法:

int main()
{
	int arr[10] = {0};
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		arr[i] = i;
#if 1
		printf("%d ", arr[i]);
#endif
	}
	return 0;
}

4.2 文件包含

#include指令可以使另外一個(gè)文件被編譯。就像它實(shí)際出現(xiàn)于#include指令的地方一樣。

本地頭文件包含:#include “filename”
查找策略:
先在源文件所在目錄下查找,如果該頭文件未找到,編譯器就像查找?guī)旌瘮?shù)頭文件一樣在標(biāo)準(zhǔn)位置查找頭文件。如果找不到就提示編譯錯(cuò)誤。

庫(kù)文件包含:#include <filename.h>
查找策略:
查找頭文件直接去標(biāo)準(zhǔn)路徑下去查找,如果找不到就提示編譯錯(cuò)誤。

4.3 嵌套文件包含

如果出現(xiàn)以下場(chǎng)景:
C語(yǔ)言中程序的編譯(預(yù)處理操作)+鏈接詳解(詳細(xì)介紹程序預(yù)編譯過(guò)程)
此時(shí),comm.h和comm.c是公共模塊。test1.h和test1.c使用了公共模塊。test2.h和test2.c使用了公共模塊。test.h和test.c使用了test1模塊和test2模塊。這樣最終程序中就會(huì)出現(xiàn)兩份comm.h的內(nèi)容。這樣就造成了文件內(nèi)容的重復(fù)。
這時(shí)候我們就可以使用條件編譯的辦法來(lái)解決這個(gè)問(wèn)題:

每個(gè)頭文件的開頭寫:
#ifndef __ TEST_H __
#define __ TEST_H __
頭文件的內(nèi)容…
#endif __ TEST_H __
或者:
#pragma once
就可以避免頭文件的重復(fù)引入。

5. 結(jié)尾

本文到這里就結(jié)束了,如果有什么問(wèn)題或者文中有錯(cuò)誤,歡迎大家在評(píng)論區(qū)留言討論,感謝大家耐心閱讀,如果幫助到大家的話,請(qǐng)各位大佬點(diǎn)贊收藏關(guān)注一波,十分感謝!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-407861.html

到了這里,關(guān)于C語(yǔ)言中程序的編譯(預(yù)處理操作)+鏈接詳解(詳細(xì)介紹程序預(yù)編譯過(guò)程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • GCC編譯過(guò)程:預(yù)處理->編譯->匯編->鏈接

    GCC編譯過(guò)程:預(yù)處理->編譯->匯編->鏈接

    目錄 引言 ?概括介紹 一、預(yù)處理 二、編譯 三、匯編 四、鏈接 總結(jié) 當(dāng)使用集成開發(fā)環(huán)境(IDE)進(jìn)行C語(yǔ)言編程時(shí),點(diǎn)擊\\\" 編譯 \\\"按鈕后,整個(gè)C程序從源代碼到可執(zhí)行文件的生成過(guò)程會(huì)自動(dòng)完成。IDE會(huì)在后臺(tái)為我們執(zhí)行C語(yǔ)言的編譯過(guò)程,將源代碼轉(zhuǎn)換為最終的可執(zhí)行文件。雖

    2024年02月13日
    瀏覽(22)
  • 【C語(yǔ)言】程序環(huán)境和預(yù)處理|預(yù)處理詳解|定義宏(下)

    【C語(yǔ)言】程序環(huán)境和預(yù)處理|預(yù)處理詳解|定義宏(下)

    主頁(yè):114514的代碼大冒 qq:2188956112(歡迎小伙伴呀hi?(。???。)??) Gitee:莊嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目錄 目錄 文章目錄 前言 2.5帶副作用的宏參數(shù) 2.6宏和函數(shù)的對(duì)比 3#undef ?編輯 4 命令行定義 5 條件編譯 6 文件包含 總結(jié) 咱們書接上回 2.5帶副作用的宏參數(shù) 先來(lái)

    2024年01月17日
    瀏覽(33)
  • Linux的編譯器——gcc/g++(預(yù)處理、編譯、匯編、鏈接)

    Linux的編譯器——gcc/g++(預(yù)處理、編譯、匯編、鏈接)

    前言: 本文主要認(rèn)識(shí)與學(xué)習(xí) Linux 環(huán)境下常用的編譯器—— gcc (編譯 C 代碼)/ g++ (編譯 C++ 代碼)的常用指令等、程序?qū)崿F(xiàn)的兩大環(huán)境、動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)的理解等。 任何一個(gè) C 程序的實(shí)現(xiàn)都要經(jīng)過(guò) 翻譯環(huán)境 與 執(zhí)行環(huán)境 。 在翻譯環(huán)境中又分為4個(gè)部分, 預(yù)編譯、編譯、匯

    2024年02月13日
    瀏覽(24)
  • C語(yǔ)言-程序環(huán)境和預(yù)處理(2)--帶副作用的宏參數(shù),宏與函數(shù)的對(duì)比,#undef,條件編譯,文件包含

    C語(yǔ)言-程序環(huán)境和預(yù)處理(2)--帶副作用的宏參數(shù),宏與函數(shù)的對(duì)比,#undef,條件編譯,文件包含

    上一篇文章–《C語(yǔ)言-程序環(huán)境和預(yù)處理(1)》講述了程序的翻譯環(huán)境和執(zhí)行環(huán)境,編譯、連接,預(yù)定義符號(hào),#define,#符號(hào)和##符號(hào)的相關(guān)知識(shí)。 鏈接: 《C語(yǔ)言-程序環(huán)境和預(yù)處理(1)》 本篇文章,講述帶副作用的宏參數(shù),宏與函數(shù)的對(duì)比,#undef,條件編譯,文件包含的相

    2024年02月08日
    瀏覽(28)
  • c語(yǔ)言中編譯過(guò)程與預(yù)處理

    c語(yǔ)言中編譯過(guò)程與預(yù)處理

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 在c語(yǔ)言的一個(gè)項(xiàng)目中會(huì)有很多.c文件,這些.c文件就是源文件,組成一個(gè)程序的每個(gè)源文件通過(guò)編譯過(guò)程分別轉(zhuǎn)換成目標(biāo)代碼(object code),即每個(gè)源文件都轉(zhuǎn)換為對(duì)應(yīng)的目標(biāo)文件,即.obj文件。 然后這些

    2024年02月11日
    瀏覽(20)
  • 預(yù)處理/預(yù)編譯詳解(C/C++)

    預(yù)處理/預(yù)編譯詳解(C/C++)

    ? ? ? ? 在上一篇的bolg中的編譯與鏈接中提到過(guò) 預(yù)處理 ,但只是較為簡(jiǎn)單的講解,本篇將會(huì)對(duì)預(yù)處理進(jìn)行詳細(xì)的講解。 ? ? ? ? 其中在預(yù)處理中很重要的一個(gè)一個(gè)知識(shí)點(diǎn)是#define定義常量與宏,還區(qū)分了宏與函數(shù)的區(qū)別,以及#和##符號(hào),還涉及條件編譯頭文件的包含等等。

    2024年01月17日
    瀏覽(23)
  • 【C語(yǔ)言】從預(yù)處理到機(jī)器代碼的C語(yǔ)言編譯過(guò)程解析

    當(dāng)我們編寫一個(gè)C語(yǔ)言程序時(shí),我們需要經(jīng)歷一個(gè)編譯的過(guò)程,將源代碼轉(zhuǎn)換為可執(zhí)行的機(jī)器代碼。這個(gè)過(guò)程涉及到多個(gè)階段和環(huán)節(jié),每個(gè)階段都有其特定的任務(wù)和功能。在本篇博客中,我們將詳細(xì)介紹C語(yǔ)言的編譯過(guò)程。 目錄 一、預(yù)處理階段(Preprocessing) 二、詞法分析階段

    2024年02月13日
    瀏覽(18)
  • 詳解C語(yǔ)言—預(yù)處理

    詳解C語(yǔ)言—預(yù)處理

    目錄 一、預(yù)處理 1、預(yù)定義符號(hào)介紹 2、預(yù)處理指令 #define #define 定義標(biāo)識(shí)符:? #define 定義宏: #define 替換規(guī)則 3、預(yù)處理操作符# 4、預(yù)處理操作符## 5、帶副作用的宏參數(shù) 6、宏和函數(shù)對(duì)比 二、命名約定 三、預(yù)處理指令 #undef 四、命令行定義 五、條件編譯? 1、單分支#if:

    2024年02月08日
    瀏覽(28)
  • C語(yǔ)言預(yù)處理詳解

    C語(yǔ)言預(yù)處理詳解

    上一篇博客中我們講了C語(yǔ)言的編譯與鏈接,在編譯過(guò)程中有三個(gè)小階段:預(yù)處理、編譯、匯編。 本篇博客將詳細(xì)講述預(yù)處理部分的有關(guān)知識(shí)點(diǎn) 。 在C語(yǔ)言中,C語(yǔ)言本身設(shè)置了?些預(yù)定義符號(hào),可以直接使? ,預(yù)定義符號(hào)的處理也是在預(yù)處理期間進(jìn)行的。 在這里介紹幾個(gè)常

    2024年04月15日
    瀏覽(39)
  • C語(yǔ)言·預(yù)處理詳解

    C語(yǔ)言·預(yù)處理詳解

    ????????C語(yǔ)言設(shè)置了一些預(yù)定義符號(hào),可以直接使用,預(yù)定義符號(hào)也是在預(yù)處理期間處理的 ????????????????__FILE__ ?進(jìn)行編譯的源文件 ????????????????__LINE__ ?文件當(dāng)前的行號(hào) ????????????????__DATE__ ?文件被編譯的日期 ????????????????_

    2024年01月21日
    瀏覽(33)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包