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

learn_C_deep_14 (條件編譯的基本使用與理解)

這篇具有很好參考價值的文章主要介紹了learn_C_deep_14 (條件編譯的基本使用與理解)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

目錄

條件編譯

1.條件編譯如何使用?

2.為何要有條件編譯?

3. 條件編譯都在哪些地方用?


條件編譯

1.條件編譯如何使用?

????????C語言的條件編譯是一種在程序編譯時根據(jù)條件選擇不同代碼段進(jìn)行編譯的技術(shù)。條件編譯可以用于實現(xiàn)代碼跨平臺,開啟或關(guān)閉某些功能,以及調(diào)試等情況。

#ifdef` 指令用于判斷某個宏是否被定義,不論我們定義的宏為真為假,如果被定義則編譯下面的代碼塊,否則跳過:

#include <stdio.h>
//#define PTINT
//#define PTINT 1  //真
//#define PTINT 0  //假
int main()
{
#ifdef PRINT //PRINT并沒有被[定義],所以代碼只保留#else部分
	printf("hello world!\n");
#else
	printf("Non Message!\n");//這句代碼會被輸出
#endif
	return 0;
}

與 `#ifdef` 相對應(yīng)的是 `#ifndef`,它用于判斷某個宏是否未被定義

#include <stdio.h>
//#define DEBUG
int main()
{
#ifndef DEBUG //DEBUG并沒有被[定義],所以代碼會輸出#ifndef內(nèi)容
	printf("hello debug\n");//這句代碼會被輸出
#else
	printf("hello release\n");
#endif
	return 0;
}

`#if` 指令可以根據(jù)表達(dá)式的值來判斷是否編譯下面的代碼塊。

// 單個條件的情況
#include <stdio.h>
//報錯
//#define DEBUG
//定義了,為假
//#define DEBUG 0
//定義了,為真
#define DEBUG 1
int main()
{
#if DEBUG
	printf("hello bitworld\n");
#endif
		return 0;
}
//帶else的情況
#include <stdio.h>
//報錯
//#define DEBUG
//定義了,為假
#define DEBUG 0
//定義了,為真
//#define DEBUG 1
int main()
{
#if DEBUG
	printf("hello world\n");
#else
	printf("hello bit\n");
#endif
	return 0;
}
//多條件的情況
//代碼一:
#include <stdio.h>
//#define DEBUG 0
//#define DEBUG 1
//#define DEBUG 2
#define DEBUG 3
int main()
{
#if DEBUG==0
	printf("hello world 0\n");
#elif DEBUG==1
	printf("hello world 1\n");
#elif DEBUG==2
	printf("hello world 2\n");
#else
	printf("hello else\n");
#endif
	return 0;

//代碼二:
#include <stdio.h>
#define DEBUG -1
//#define DEBUG 0
//#define DEBUG 1
//#define DEBUG 2
int main()
{
#if DEBUG<0
	printf("hello world 0\n");
#elif DEBUG<1
	printf("hello world 1\n");
#elif DEBUG<2
	printf("hello world 2\n");
#else
	printf("hello else\n");
#endif
	return 0;
}

#if模擬#ifdef

#include <stdio.h>
#define DEBUG
int main()
{
#if defined(DEBUG)
	printf("hello debug\n");//這句話會被輸出
#else
	printf("hello release\n");
#endif
	return 0;
}

#if模擬#ifndef

#include <stdio.h>
//#define DEBUG
int main()
{
#if !defined(DEBUG)
    printf("hello debug\n");//這句話會被輸出
#else
    printf("hello release\n");
#endif
    return 0;
}

練習(xí)

#include <stdio.h>
#define C
#define CPP
int main()
{
#if defined(C) && defined(CPP)
	//#if (defined(C) && defined(CPP)) //建議使用這種方式
	printf("hello c&&cpp\n");//這句話會被輸出
#else
	printf("hello other\n");
#endif
	return 0;
}

????????這段代碼使用了條件編譯指令,定義了兩個宏C和CPP,并且使用#if defined指令判斷是否同時定義了這兩個宏。

????????當(dāng)同時定義了C和CPP時,程序執(zhí)行#if defined(C) && defined(CPP)條件滿足,會輸出"hello c&&cpp"。如果C和CPP沒有同時定義,則條件不滿足,會輸出"hello other"。

在這段代碼中,#if defined(C) && defined(CPP)和#if (defined(C) && defined(CPP))的效果是相同的。兩者都是判斷C和CPP是否都已經(jīng)被定義了,如果都被定義,則條件滿足,執(zhí)行相應(yīng)的代碼塊。

????????注意,程序中使用#define指令定義的宏只是簡單的文本替換,不會經(jīng)過類型檢查和語法檢查。因此在使用宏時需要謹(jǐn)慎,避免出現(xiàn)不必要的錯誤。

#include <stdio.h>
#define C
//#define CPP
int main()
{
#if defined(C) || defined(CPP)
	//#if (defined(C) || defined(CPP))
	printf("hello c||cpp\n");//這句話會被輸出
#else
	printf("hello other\n");
#endif
	return 0;
}

????????這段代碼與前面的稍有不同,它使用#if defined指令判斷了C和CPP是否至少有一個被定義了,即#if defined(C) || defined(CPP)。當(dāng)C和CPP中至少有一個被定義時,條件滿足,會輸出"hello c || cpp"。否則條件不滿足,會輸出"hello other"。

????????和前面一樣,注釋掉#define CPP的語句,則只有C被定義,條件不滿足,會輸出"hello other"。

????????需要注意的是,#if defined(C) || defined(CPP)和#if (defined(C) || defined(CPP))的效果也是相同的,這兩種寫法都是判斷C和CPP是否至少有一個被定義了,如果有,則條件滿足,執(zhí)行相應(yīng)的代碼塊。

#include <stdio.h>
#define C
#define CPP
int main()
{
#if !(defined(C) || defined(CPP))
	printf("hello c || cpp\n");//這句話會被輸出
#else
	printf("hello other\n");
#endif
	return 0;
}

????????這是一個C語言程序,定義了兩個宏:C和CPP,并在主函數(shù)中使用了#if和#ifndef預(yù)編譯指令。

????????#if !(defined(C) || defined(CPP))表示如果C和CPP中的宏都未定義,則執(zhí)行if語句內(nèi)的代碼,輸出"hello c || cpp"。但是由于C和CPP都被定義了,所以if語句的條件不成立,所以會執(zhí)行else語句內(nèi)的代碼,輸出"hello other"。因此,這個程序的輸出結(jié)果是"hello other"。

#include <stdio.h>
#define C
#define CPP
int main()
{
#if defined(C)
	#if defined (CPP)
		printf("hello CPP\n");//這句話會被輸出
	#endif
	printf("hello C\n");//這句話會被輸出
#else
	printf("hello other\n");
#endif
	return 0;
}

????????這是一個C語言程序,其中使用了條件編譯指令。程序定義了兩個宏,分別為C和CPP。在main函數(shù)中,先判斷宏C是否被定義,如果被定義,則進(jìn)入C語言的條件編譯指令中。在這個指令中,又判斷宏CPP是否被定義,如果被定義,則輸出"hello CPP\n"。無論宏CPP是否被定義,都會輸出"hello C\n"。

????????如果宏C沒有被定義,則程序進(jìn)入另一個條件編譯指令中,輸出"hello other\n"。因此,運(yùn)行該程序,會輸出"hello CPP\n"和"hello C\n"。

#include <stdio.h>
#define C
#define CPP
int main()
{
#if defined(C)
	printf("hello C\n");
#elif defined (CPP)
	printf("hello CPP\n");
#else
	printf("hello other\n");
#endif
	return 0;
}

????????這是一個C語言程序,其中定義了兩個宏C和CPP。在main函數(shù)中,同樣使用了條件編譯指令#if-elif-else-endif。在這個指令中,先判斷宏C是否被定義,如果被定義,則輸出"hello C\n"。如果宏C沒有被定義,再判斷宏CPP是否被定義,如果被定義,則輸出"hello CPP\n"。如果宏C和CPP都沒有被定義,則輸出"hello other\n"。

????????由于宏C和CPP都被定義了,因此運(yùn)行該程序會輸出"hello C\n"。

#if 和 #ifdef的區(qū)別

????????#if和#ifdef是C預(yù)處理中的條件編譯指令,它們的作用都是根據(jù)某個宏的定義情況來判斷編譯代碼的方式。

????????#if的語法形式為#if 常量表達(dá)式,它會首先對常量表達(dá)式進(jìn)行求值,如果表達(dá)式的值為真,則編譯這個#if與對應(yīng)的#endif之間的代碼,否則忽略這個#if與對應(yīng)的#endif之間的代碼。

#ifdef的語法形式為#ifdef 宏名,它用來判斷某個宏是否定義了。如果宏被定義了,則編譯#ifdef與對應(yīng)的#endif之間的代碼,否則忽略這個#ifdef與對應(yīng)的#endif之間的代碼。

????????它們的主要區(qū)別在于#if是對表達(dá)式的求值結(jié)果進(jìn)行判斷,可以進(jìn)行更加復(fù)雜的條件判斷,而#ifdef只是判斷宏是否被定義,不能進(jìn)行表達(dá)式求值。另外,由于#if可以進(jìn)行表達(dá)式求值,因此在某些情況下,#if比#ifdef會更加靈活和方便。

條件編譯和宏替換誰先執(zhí)行

宏替換先于條件編譯執(zhí)行。

????????在C語言中,預(yù)處理器會先對源代碼進(jìn)行宏替換,將源代碼中的宏名稱替換為相應(yīng)的宏定義,然后再對替換后的代碼進(jìn)行條件編譯。也就是說,條件編譯是在宏替換之后進(jìn)行的。這也就意味著,在條件編譯中對宏的定義或者值的改變,并不會影響到之前宏替換的結(jié)果。

在進(jìn)行宏替換時,預(yù)處理器會根據(jù)宏定義中的替換列表來進(jìn)行替換。如果宏定義中包含了其他宏的調(diào)用,那么預(yù)處理器會先對這些宏進(jìn)行替換,然后再對當(dāng)前宏進(jìn)行替換。這種替換過程會一直持續(xù)下去,直到不包含其他宏的調(diào)用為止。

????????總的來說,宏替換是在條件編譯之前進(jìn)行的,而且它是一個遞歸的過程,可以包含其他宏的調(diào)用,最終將源代碼中的所有宏替換為相應(yīng)的宏定義后,再對替換后的代碼進(jìn)行條件編譯。

條件編譯可以用來注釋代碼嗎?推不推薦?

????????條件編譯可以用來注釋代碼,但不是最佳實踐,因為它會影響到代碼的可讀性和可維護(hù)性。

????????在條件編譯中,使用了類似于`#if 0 ... #endif`的語句來注釋掉代碼,它會導(dǎo)致這段代碼被編譯器忽略掉,從而達(dá)到注釋的效果。如果這種語句對應(yīng)的條件值為假,則這段代碼將永遠(yuǎn)不會被編譯,從而達(dá)到注釋掉代碼的效果。

????????然而,使用條件編譯來注釋代碼會使得代碼難以閱讀,特別是在復(fù)雜的代碼環(huán)境中。因為代碼注釋完全可以通過標(biāo)準(zhǔn)注釋語法來實現(xiàn),這樣會更加清晰易懂,也更易于維護(hù)。而使用條件編譯來注釋代碼,會給讀代碼的人帶來很大的困擾,因為他們不得不去尋找代碼中存在的所有條件編譯語句,以了解到底有哪些代碼是被注釋掉的。

????????因此,推薦使用標(biāo)準(zhǔn)注釋語法來進(jìn)行注釋,并盡可能避免使用條件編譯來注釋掉代碼。這樣會使代碼更具可讀性和可維護(hù)性。

結(jié)論:條件編譯本質(zhì)是讓編譯器進(jìn)行代碼裁剪。

2.為何要有條件編譯?

learn_C_deep_14 (條件編譯的基本使用與理解)

3. 條件編譯都在哪些地方用?

learn_C_deep_14 (條件編譯的基本使用與理解)文章來源地址http://www.zghlxwxcb.cn/news/detail-461314.html

到了這里,關(guān)于learn_C_deep_14 (條件編譯的基本使用與理解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Deep Learning-學(xué)習(xí)筆記

    deep learning訓(xùn)練過程 如果對所有層同時訓(xùn)練,時間復(fù)雜度會太高;如果每次訓(xùn)練一層,偏差就會逐層傳遞。這會面臨跟上面監(jiān)督學(xué)習(xí)中相反的問題,會嚴(yán)重欠擬合(因為深度網(wǎng)絡(luò)的神經(jīng)元和參數(shù)太多了)。 2006年,hinton提出了在非監(jiān)督數(shù)據(jù)上建立多層神經(jīng)網(wǎng)絡(luò)的一個有效方法,

    2024年02月12日
    瀏覽(22)
  • MATLAB Deep learning

    MATLAB Deep learning

    深度學(xué)習(xí)是一種機(jī)器學(xué)習(xí),而機(jī)器學(xué)習(xí)是一種人工智能。 機(jī)器學(xué)習(xí)的本質(zhì) :機(jī)器學(xué)習(xí)是一種從“數(shù)據(jù)”中找到“模型”的技術(shù)。在這里,數(shù)據(jù)的字面意思是指文檔、音頻、圖像等信息。這個“模型”是機(jī)器學(xué)習(xí)的最終產(chǎn)物。 機(jī)器學(xué)習(xí)的創(chuàng)建是為了 解決分析模型幾乎不可用的

    2024年01月17日
    瀏覽(42)
  • deep learning 代碼筆記

    deep learning 代碼筆記

    len (X)總是返回第0軸的長度。 What are the shapes of summation outputs along axis 0, 1, and 2? f ( x ) = ||? x|| ? 2 的梯度 自動微分法計算: 因此,梯度是x的單位向量。在x = 0處的梯度在數(shù)學(xué)上是未定義的,但是自動微分返回零。要小心,在這種情況下可能會出現(xiàn)差異。 默認(rèn)情況下,最后一

    2024年02月21日
    瀏覽(27)
  • The Deep Learning AI for Environmental Monitoring——Deep

    作者:禪與計算機(jī)程序設(shè)計藝術(shù) 環(huán)境監(jiān)測是整個經(jīng)濟(jì)社會發(fā)展的一個重要環(huán)節(jié),環(huán)境數(shù)據(jù)是影響經(jīng)濟(jì)、金融、社會和政策走向的不可或缺的組成部分。目前,環(huán)境監(jiān)測主要依靠地面站(例如氣象臺)或者衛(wèi)星遙感影像獲取的數(shù)據(jù)進(jìn)行實時監(jiān)測,其精確度受到數(shù)據(jù)源和采集技術(shù)

    2024年02月08日
    瀏覽(24)
  • Tips for Deep Learning

    Tips for Deep Learning

    目錄 Recipe of Deep Learning ?Good Results on Training Data? New activation function Adaptive learning rate Good Results on Testing Data? Early Stopping Regularization Dropout 我們要做的第一件事是,提高model在training set上的正確率,然后要做的事是,提高model在testing set上的正確率。 這一部分主要講述如何在

    2024年02月05日
    瀏覽(24)
  • 《Dive into Deep Learning》

    《Dive into Deep Learning》

    《Dive into Deep Learning》:https://d2l.ai/ Interactive deep learning book with code, math, and discussions Implemented with PyTorch, NumPy/MXNet, JAX, and TensorFlow Adopted at 500 universities from 70 countries 《動手學(xué)深度學(xué)習(xí)》中文版:https://zh.d2l.ai/chapter_preface/index.html 課程安排: https://courses.d2l.ai/zh-v2/

    2024年02月11日
    瀏覽(18)
  • 《Learning to Reweight Examples for Robust Deep Learning》筆記

    [1] 用 meta-learning 學(xué)樣本權(quán)重,可用于 class imbalance、noisy label 場景。之前對其 (7) 式中 ? i , t = 0 epsilon_{i,t}=0 ? i , t ? = 0 ( 對應(yīng) Algorithm 1 第 5 句、代碼 ex_wts_a = tf.zeros([bsize_a], dtype=tf.float32) )不理解:如果 ? epsilon ? 已知是 0,那 (4) 式的加權(quán) loss 不是恒為零嗎?(5) 式不是

    2024年01月23日
    瀏覽(28)
  • 可信深度學(xué)習(xí)Trustworthy Deep Learning相關(guān)論文

    可信深度學(xué)習(xí)Trustworthy Deep Learning相關(guān)論文

    Survey An Overview of Catastrophic AI Risks. [paper] Connecting the Dots in Trustworthy Artificial Intelligence: From AI Principles, Ethics, and Key Requirements to Responsible AI Systems and Regulation. [paper] A Survey of Trustworthy Federated Learning with Perspectives on Security, Robustness, and Privacy. [paper] Adversarial Machine Learning: A Systemati

    2024年02月13日
    瀏覽(24)
  • AIGC實戰(zhàn)——深度學(xué)習(xí) (Deep Learning, DL)

    AIGC實戰(zhàn)——深度學(xué)習(xí) (Deep Learning, DL)

    深度學(xué)習(xí) ( Deep Learning , DL ) 是貫穿所有生成模型 ( Generative Model ) 的共同特征,幾乎所有復(fù)雜的生成模型都以深度神經(jīng)網(wǎng)絡(luò)為核心,深度神經(jīng)網(wǎng)絡(luò)能夠?qū)W習(xí)數(shù)據(jù)結(jié)構(gòu)中的復(fù)雜關(guān)系,而不需要預(yù)先提取數(shù)據(jù)特征。在本節(jié)中,我們將介紹深度學(xué)習(xí)基本概念,并利用 Keras 構(gòu)建深度神

    2024年02月08日
    瀏覽(26)
  • 【論文閱讀】Deep Graph Contrastive Representation Learning

    【論文閱讀】Deep Graph Contrastive Representation Learning

    作者:Yanqiao Zhu Yichen Xu 文章鏈接:Deep Graph Contrastive Representation Learning 代碼鏈接:Deep Graph Contrastive Representation Learning 現(xiàn)實世界中,圖的標(biāo)簽數(shù)量較少,盡管GNNs蓬勃發(fā)展,但是訓(xùn)練模型時標(biāo)簽的可用性問題也越來越受到關(guān)心。 傳統(tǒng)的無監(jiān)督圖表征學(xué)習(xí)方法,例如DeepWalk和nod

    2024年01月18日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包