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

預(yù)處理詳解(#和##運(yùn)算符、命名約定、#undef??、命令行定義?、條件編譯、頭文件的包含?)

這篇具有很好參考價值的文章主要介紹了預(yù)處理詳解(#和##運(yùn)算符、命名約定、#undef??、命令行定義?、條件編譯、頭文件的包含?)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一、#和##

1.1#運(yùn)算符

1.2## 運(yùn)算符?

二、命名約定?

三、#undef?

四、命令行定義?

五、條件編譯?

六、頭文件的包含?

4.1 頭文件被包含的方式:?

4.1.1?本地文件包含?

Linux環(huán)境的標(biāo)準(zhǔn)頭文件的路徑:?

VS環(huán)境的標(biāo)準(zhǔn)頭文件的路徑:

4.1.2庫文件包含?

4.2嵌套文件包含?


一、#和##

1.1#運(yùn)算符

#運(yùn)算符?
#運(yùn)算符將宏的一個參數(shù)轉(zhuǎn)換為字符串字面量。它僅允許出現(xiàn)在帶參數(shù)的宏的替換列表中。?
#運(yùn)算符所執(zhí)行的操作可以理解為”字符串化“。?
當(dāng)我們有一個變量 int a = 10; 的時候,我們想打印出: the value of a is 10 .?
就可以寫:

#define PRINT(n)

printf("the value of "#n " is %d", n);

當(dāng)我們按照下面的方式調(diào)用的時候:
?PRINT(a);//當(dāng)我們把a(bǔ)替換到宏的體內(nèi)時,就出現(xiàn)了#a,而#a就是轉(zhuǎn)換為"a",時一個字符串?
代碼就會被預(yù)處理為:

printf("the value of ""a" " is %d", a);

運(yùn)行代碼就能在屏幕上打印:

?the value of a is 10

預(yù)處理詳解(#和##運(yùn)算符、命名約定、#undef??、命令行定義?、條件編譯、頭文件的包含?),開發(fā)語言,c語言,筆記,算法

1.2## 運(yùn)算符?

## 可以把位于它兩邊的符號合成一個符號,它允許宏定義從分離的文本片段創(chuàng)建標(biāo)識符。 ## 被稱
為記號粘合
這樣的連接必須產(chǎn)生一個合法的標(biāo)識符。否則其結(jié)果就是未定義的。
這里我們想想,寫一個函數(shù)求2個數(shù)的較大值的時候,不同的數(shù)據(jù)類型就得寫不同的函數(shù)。?
比如:

int int_max(int x, int y)
{
 return x>y?x:y;
}
float float_max(float x, float y)
{
 return x>yx:y;
}

但是這樣寫起來太繁瑣了,現(xiàn)在我們這樣寫代碼試試:

//宏定義?
#define GENERIC_MAX(type) \
type type##_max(type x, type y)\
{ \
?return (x>y?x:y);\
}\

使用宏,定義不同函數(shù)

GENERIC_MAX(int) //替換到宏體內(nèi)后int##_max 生成了新的符號 int_max做函數(shù)名?
GENERIC_MAX(float) //替換到宏體內(nèi)后float##_max 生成了新的符號 float_max做函數(shù)名
int main()
{
 //調(diào)用函數(shù)?
 int m = int_max(2, 3);
 printf("%d\n", m);
 float fm = float_max(3.5f, 4.5f);
 printf("%f\n", fm);
 return 0;
}

在實際開發(fā)過程中##使用的很少,很難取出非常貼切的例子。?

//宏定義?
#define GENERIC_MAX(type) \
type type##_max(type x, type y)\
{\
	return (x>y?x:y);\
}\

GENERIC_MAX(int) //替換到宏體內(nèi)后int##_max 生成了新的符號 int_max做函數(shù)名?
GENERIC_MAX(float) 
int main()
{
	
	//調(diào)用函數(shù)?
	int m = int_max(2, 3);
	printf("%d\n", m);
	float fm = float_max(3.5f, 4.5f);
	printf("%f\n", fm);
	return 0;
}

預(yù)處理詳解(#和##運(yùn)算符、命名約定、#undef??、命令行定義?、條件編譯、頭文件的包含?),開發(fā)語言,c語言,筆記,算法

二、命名約定?

一般來講函數(shù)的宏的使用語法很相似。所以語言本身沒法幫我們區(qū)分二者。
那我們平時的一個習(xí)慣是:

把宏名全部大寫
函數(shù)名不要全部大寫

但是也有例外: offsetof

三、#undef?

這條指令用于移除一個宏定義。

#undef NAME
//如果現(xiàn)存的一個名字需要被重新定義,那么它的舊名字首先要被移除。?

#define MAX 100

int main()
{
	printf("%d\n", MAX);
#undef MAX   //移除宏定義
	//printf("%d\n", MAX);

#define MAX 1000
	printf("%d\n", MAX);

	return 0;
}

?預(yù)處理詳解(#和##運(yùn)算符、命名約定、#undef??、命令行定義?、條件編譯、頭文件的包含?),開發(fā)語言,c語言,筆記,算法

四、命令行定義?

許多C 的編譯器提供了一種能力,允許在命令行中定義符號。用于啟動編譯過程。?
例如:當(dāng)我們根據(jù)同一個源文件要編譯出一個程序的不同版本的時候,這個特性有點用處。(假定某個程序中聲明了一個某個長度的數(shù)組,如果機(jī)器內(nèi)存有限,我們需要一個很小的數(shù)組,但是另外一個機(jī)器內(nèi)存大些,我們需要一個數(shù)組能夠大些。)

#include <stdio.h>
int main()
{
     int array [ARRAY_SIZE];
     int i = 0;
     for(i = 0; i< ARRAY_SIZE; i ++)
 {
     array[i] = i;
 }
     for(i = 0; i< ARRAY_SIZE; i ++)
 {
     printf("%d " ,array[i]);
 }
     printf("\n");
     return 0;
}

預(yù)處理詳解(#和##運(yùn)算符、命名約定、#undef??、命令行定義?、條件編譯、頭文件的包含?),開發(fā)語言,c語言,筆記,算法

編譯指令:?

//linux 環(huán)境演示?
gcc -D ARRAY_SIZE=10 programe.c

在不改變代碼的情況下,編譯出不同的版本

五、條件編譯?

在編譯一個程序的時候我們?nèi)绻獙⒁粭l語句(一組語句)編譯或者放棄是很方便的。因為我們有條件編譯指令。在預(yù)處理階段,如果滿足條件執(zhí)行后續(xù)語句,如果不滿足,就不執(zhí)行
比如說:
調(diào)試性的代碼,刪除可惜,保留又礙事,所以我們可以選擇性的編譯。
?

#include <stdio.h>
#define __DEBUG__
 int main()
 {
     int i = 0;
     int arr[10] = { 0 };
     for (i = 0; i < 10; i++)
     {
         arr[i] = i;
    #ifdef __DEBUG__    //如果__DEBUG__為真就參與編譯
         printf("%d\n", arr[i]);//為了觀察數(shù)組是否賦值成功。 ?
    #endif //__DEBUG__
     }
     return 0;
 }
  int main()
 {
     #if 1==2
         printf("hehe\n");//不參與編譯
     #endif
     return 0;
 }
#define M 3
int main()
{
    int a = 3;
    #if M==a//err  a是局部變量,預(yù)編譯時不參與
        printf("hehe\n");
    #endif
    return 0;
}
  #define M 2
 int main()
 {
     #if M==1
         printf("hehe\n");
     #elif M==2
         printf("haha\n");
     #elif M == 3
         printf("heihei\n");
     #else
         printf("~~~~\n");
     #endif
     return 0;
 }

常見的條件編譯指令:?

1.#if 常量表達(dá)式
 //...
#endif
//常量表達(dá)式由預(yù)處理器求值。?
如:
#define __DEBUG__ 1
#if __DEBUG__
 //..
#endif    
//結(jié)束條件編譯

2.多個分支的條件編譯
#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();

預(yù)處理詳解(#和##運(yùn)算符、命名約定、#undef??、命令行定義?、條件編譯、頭文件的包含?),開發(fā)語言,c語言,筆記,算法

六、頭文件的包含?

4.1 頭文件被包含的方式:?

4.1.1?本地文件包含?

#include "filename"

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

Linux環(huán)境的標(biāo)準(zhǔn)頭文件的路徑:?

/usr/include

VS環(huán)境的標(biāo)準(zhǔn)頭文件的路徑:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include
//這是VS2013的默認(rèn)路徑?

注意按照自己的安裝路徑去找。

4.1.2庫文件包含?

#include <filename.h>

查找頭文件直接去標(biāo)準(zhǔn)路徑下去查找,如果找不到就提示編譯錯誤。
這樣是不是可以說,對于庫文件也可以使用 “” 的形式包含?
答案是肯定的,可以,但是這樣做查找的效率就低些,當(dāng)然這樣也不容易區(qū)分是庫文件還是本地文件了。

4.2嵌套文件包含?

我們已經(jīng)知道, #include 指令可以使另外一個文件被編譯。就像它實際出現(xiàn)于 #include 指令的
地方一樣。
這種替換的方式很簡單:預(yù)處理器先刪除這條指令,并用包含文件的內(nèi)容替換。
一個頭文件被包含10次,那就實際被編譯10次,如果重復(fù)包含,對編譯的壓力就比較大。

預(yù)處理詳解(#和##運(yùn)算符、命名約定、#undef??、命令行定義?、條件編譯、頭文件的包含?),開發(fā)語言,c語言,筆記,算法

如果直接這樣寫,test.c文件中將test.h包含5次,那么test.h文件的內(nèi)容將會被拷貝5份在test.c中。?
如果test.h 文件比較大,這樣預(yù)處理后代碼量會劇增。如果工程比較大,有公共使用的頭文件,被大家都能使用,又不做任何的處理,那么后果真的不堪設(shè)想。
如何解決頭文件被重復(fù)引入的問題?答案:條件編譯。
每個頭文件的開頭寫:

#ifndef __TEST_H__
#define __TEST_H__
//頭文件的內(nèi)容?
#endif //__TEST_H__

或者

#pragma once

就可以避免頭文件的重復(fù)引入。

筆試題:
1. 頭文件中的 ifndef/define/endif是干什么用的??

答:用于防止頭文件的內(nèi)容在同一個編譯單元中被多次包含。
2. #include <filename.h> 和 #include "filename.h"有什么區(qū)別? ?

答:#include <filename.h>:這是用于包含系統(tǒng)提供的頭文件的常用格式。編譯器通常會在其預(yù)定義的系統(tǒng)頭文件目錄中查找這樣的文件。

#include "filename.h":這是用于包含用戶定義的頭文件或項目特定的頭文件的常用格式。編譯器首先在當(dāng)前文件或指定的用戶目錄中查找這樣的文件,如果找不到,它可能會回退到系統(tǒng)目錄。

? ??

其他預(yù)處理指令?

#error
#pragma
#line
...
不做介紹,自己去了解。
#pragma pack()在結(jié)構(gòu)體部分介紹。

祝大家新年快樂?。。?/p>

?預(yù)處理詳解(#和##運(yùn)算符、命名約定、#undef??、命令行定義?、條件編譯、頭文件的包含?),開發(fā)語言,c語言,筆記,算法

看到這里了還不給博主扣個:
?? 點贊??收藏 ?? 關(guān)注!

你們的點贊就是博主更新最大的動力!
有問題可以評論或者私信呢秒回哦。文章來源地址http://www.zghlxwxcb.cn/news/detail-801551.html

到了這里,關(guān)于預(yù)處理詳解(#和##運(yùn)算符、命名約定、#undef??、命令行定義?、條件編譯、頭文件的包含?)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • C語言中的運(yùn)算符及算術(shù)運(yùn)算符詳解

    在C語言中,運(yùn)算符是一種特殊的符號,用于表示數(shù)據(jù)的運(yùn)算、賦值和比較等。本文將介紹C語言中的運(yùn)算符,特別關(guān)注算術(shù)運(yùn)算符,并提供一些示例來說明它們的用法。 C語言中的運(yùn)算符可以按照其功能和操作數(shù)個數(shù)進(jìn)行分類。以下是一些主要的運(yùn)算符分類: 1. 按照功能分類

    2024年01月22日
    瀏覽(53)
  • C# 運(yùn)算符詳解:包含算術(shù)、賦值、比較、邏輯運(yùn)算符及 Math 類應(yīng)用

    運(yùn)算符用于對變量和值執(zhí)行操作。在C#中,有多種運(yùn)算符可用,包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符等。 算術(shù)運(yùn)算符用于執(zhí)行常見的數(shù)學(xué)運(yùn)算: 遞增運(yùn)算符 ++ 用于將變量的值增加 1,而遞減運(yùn)算符 -- 用于將變量的值減少 1: 在實際編碼中,請注意避免在表達(dá)式中使用

    2024年01月20日
    瀏覽(29)
  • 運(yùn)算符詳解(c語言)

    運(yùn)算符詳解(c語言)

    引言: hello,大家好!我是心跳sy,今天給大家分享c語言運(yùn)算符詳解,我們知道,c語言的一個顯著特點就是表達(dá)式的應(yīng)用,表達(dá)式是表示如何計算值的公式,而運(yùn)算符又是構(gòu)建表達(dá)式的基本工具,c語言擁有非常豐富的運(yùn)算符,包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、賦

    2024年02月12日
    瀏覽(21)
  • 操作符(運(yùn)算符)詳解

    ??????大家覺不錯的話,就懇求大家點點關(guān)注,點點小愛心,指點指點?????? 目錄 ??算數(shù)操作符:+? ? -? ? *? ? /? ? % ??移位操作符:? ? ??進(jìn)制的定義? ??整數(shù)二進(jìn)制表示形式 ?? 左移操作符 ??右移操作符 ??位操作符: ? | ? ^ ?? ??(按位與)|(按位或)

    2024年01月19日
    瀏覽(25)
  • C語言運(yùn)算符詳解

    【導(dǎo)言】 C語言是一門非常底層的編程語言,它支持多種運(yùn)算符進(jìn)行數(shù)值運(yùn)算、邏輯運(yùn)算等操作。C語言中的運(yùn)算符主要有算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符、條件運(yùn)算符等。本篇文章將會詳細(xì)介紹C語言中的各種運(yùn)算符及其使用方法。 一、算術(shù)運(yùn)

    2024年02月07日
    瀏覽(20)
  • C 語言運(yùn)算符詳解

    運(yùn)算符用于對變量和值進(jìn)行操作。 在下面的示例中,我們使用 + 運(yùn)算符將兩個值相加: 雖然 + 運(yùn)算符通常用于將兩個值相加,就像上面的示例一樣,它還可以用于將變量和值相加,或者將變量和另一個變量相加: C 將運(yùn)算符分為以下幾組: 算術(shù)運(yùn)算符 賦值運(yùn)算符 比較運(yùn)算

    2024年02月04日
    瀏覽(25)
  • c++ 友元 運(yùn)算符重載詳解

    c++ 友元 運(yùn)算符重載詳解

    c++是面向?qū)ο蟮?,目的之一:封裝 封裝: 優(yōu)點之一,就是安全。 缺點:在某些特殊的場合,不是很方便。 華為與IBM 40億的咨詢故事 IBM需要對華為各級部門做深度咨詢分析, 為了提高咨詢效率,由任正非直接授權(quán),直接獲取各部門的所有權(quán)限。 使用前提: 某個類需要實現(xiàn)

    2024年02月11日
    瀏覽(25)
  • 位運(yùn)算符及其相關(guān)操作詳解

    位運(yùn)算符及其相關(guān)操作詳解

    前言:由于位運(yùn)算符是直接對二進(jìn)制數(shù)操作,因此對二進(jìn)制、八進(jìn)制、十六進(jìn)制不甚了解的小伙伴建議先看這篇二進(jìn)制、八進(jìn)制、十六進(jìn)制與十進(jìn)制的相互關(guān)系,這樣閱讀本篇時將事半功倍 位運(yùn)算是對 計算機(jī)存儲的二進(jìn)制序列的相應(yīng)位進(jìn)行操作 位運(yùn)算的 操作數(shù)必須是整數(shù)型

    2024年02月05日
    瀏覽(58)
  • C++語法——詳解運(yùn)算符重載

    C++語法——詳解運(yùn)算符重載

    運(yùn)算符重載是C++的一個重要特性。有了運(yùn)算符重載,在代碼編寫時能更好的實現(xiàn)封裝。 目錄 一.運(yùn)算符重載介紹 二.運(yùn)算符重載形式 (一).參數(shù) (二).返回值 (三).應(yīng)用 三.特殊的運(yùn)算符重載 (一).默認(rèn)賦值運(yùn)算符重載 (二).自增運(yùn)算符A++與++A (三).流提取與流插入

    2023年04月25日
    瀏覽(45)
  • 「PHP系列」PHP 運(yùn)算符詳解

    在 PHP 中,運(yùn)算符用于執(zhí)行各種操作,如算術(shù)運(yùn)算、比較、邏輯運(yùn)算、字符串連接等。以下是一些 PHP 中常用的運(yùn)算符: 加法 ( + ) 減法 ( - ) 乘法 ( * ) 除法 ( / ) 取模 (余數(shù)) ( % ) 取整 ( intdiv() ) 賦值 ( = ) 加等于 ( += ) 減等于 ( -= ) 乘等于 ( *= ) 除等于 ( /= ) 取模等于 ( %= ) 等于

    2024年04月11日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包