由列舉引起的對編譯和巨集預編譯的理解思考
話不多說,先上一段神奇的程式碼!
#include <stdio.h>
#include <stdlib.h>
enum t
{
a,
b,
};
int main()
{
printf("b = %d\n", b);
#if (b==0)
printf("b=0\n");
#elif (b==1)
printf("b=1\n");
#endif
return 0;
}
猜,答案會是多少呢?
b = 1
b=0
Process returned 0 (0x0) execution time : 0.034 s
Press any key to continue.
為啥,第二行那個會是0呢?
這就要說到寫這篇部落格的意義了,,關於預編譯和編譯了。
列舉成員的值是在,編譯階段確定的。而所有的巨集展開巨集替換是在預編譯階段進行的。所以此處犯了一個很大的錯誤。把列舉成員的值放在了巨集的預編譯下,因為預編譯是提前於編譯的,所以b被認為是0。
tips:
1、切記,不要把列舉的編譯時期才能確定變數的值放到巨集的預編譯。
2、列舉中變數以逗號結尾。
相關推薦
由列舉引起的對編譯和巨集預編譯的理解思考
話不多說,先上一段神奇的程式碼! #include <stdio.h> #include <stdlib.h> enum t { a, b, }; int main() { printf("b = %d\n"
Mybatis中#{}和${}的區別以及對sql注入、預編譯、jdbcType的說明
#{}和${}都可以獲取map中的值或者pojo物件屬性的值; sql語句示例: select * from tbl_employee where id=${id} and last_name=#{lastName} Preparing: select * from tbl_employee
HbuildX(綠版)開啟對less等的預編譯
HbuildX開啟對less的預編譯 在使用HbuildX十分(綠色的版本)的時候安裝less,sass等外掛後發現每次儲存less檔案後一定要從文件中應用外部命令才會使我們的CSS檔案發生對應改變,十分的浪費時間,然後網上找HbuildX開啟對less的預編譯,發現搜到的都是Hbuil
誤用Freemarker標籤和SpringJDBC預編譯功能導致的記憶體洩露問題分析
一. 問題描述 本人所在的專案組專案已經執行快一年了,功能效能都比較穩定。但是最近釋出了一個版本,只是業務上增加了一些資料量,最終效果卻是在持續執行的過程中,出現OOM異常。之前也發過一些版本,做過一些類似的調整,都沒有出現效能問題,而這個版本卻出現了,著實
通過命令列cl.exe編譯Windows程式--預編譯跟蹤巨集定義
編寫C、C++程式的時候,使用各種巨集定義是非常常見的。但是比較蛋疼的首先就是巨集定義有副作用,並且副作用有時候我們還不容易發現。其次就是使用巨集定義函式片段,特別是比較長函式片段的時候,直接檢視vs 2008的編譯錯誤提示,很多時候根本就沒有辦法一眼看出哪裡出錯
對極值和凹凸性的理解
對 f ( x )
CSS——對height和line-height的理解
ref 之間 -c blog oct 一個 nbsp 變化 set 最近在做CSS界面時經常遇到line-height和height這兩個屬性,一直沒搞很明白,今天靜下心來好好網上查閱了一下,算是有所領悟。https://blog.csdn.net/a2013126370/
編譯過程:預編譯、編譯、彙編與連結
原文地址:http://blog.csdn.net/u014120684/article/details/46352167 預編譯的副檔名是ii gcc -E hello.c -o hello.i 預編譯過程主要處理原始碼檔案當中的以#開頭的預編譯指令,比如#in
預編譯頭 #include"預編譯標頭檔案"為何要放在第一句
vs2010 預編譯頭 jiese1990 預編譯頭原理 你有兩個檔案a.cpp和b.cpp,都包含了同一個標頭檔案c.h。那麼正常的流程是:將c.h和a.cpp合併,編譯成a.obj;將c.h和b
對dijkstra和Floyd演算法的理解
演算法的適應範圍 Floyed 演算法: 弗洛伊德演算法是解決任意兩點間的最短路徑的一種演算法,可以正確處理無向圖或有向圖或負權(但不可存在負權迴路)的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。 Floyed演算法允許圖中有帶負權值邊,允許有迴路,但不允許有帶負
我對MVC和MVP的一些理解
MVC MVC是軟體架構中最常見的一種框架,簡單來說就是通過controller的控制去操作model層的資料,並且返回給view層展示. 比如當用戶出發事件的時候,view層會發送指令到controller層,接著controller去通知model層更新
day19——常用正則表達式、re正則對象和正則匹配效率比較、編譯正則對象
import com pattern ima 優先 打印 來看 image python 正則網站:regex101.com 在了解re模塊之前,我們可以先了解一下正則表達式,正則表達式在很多語言中都有使用,但是不同的語言直接又有有些細小的區別,下面我們就來列舉一下
Part5 數據的共享與保護 5.6多文件結構和預編譯命令
靜態數據成員 其它 pac object c void 使用 內聯 組合 getx C++程序的一般組織結構: 1 一個工程可以劃分為多個源文件: 類聲明文件(.h文件) 類實現文件(.cpp文件) 類的使用文件(main()所在的.cpp
【Statement和PreparedStatement有什麽區別?哪個性能更好?預編譯語句,防止sql註入問題】
dstat () 驅動程序 對象 生成 from result 查詢語句 驅動 答:與Statement相比,①PreparedStatement接口代表預編譯的語句,它主要的優勢在於可以減少SQL的編譯錯誤並增加SQL的安全性(減少SQL註射攻擊的可能性);②Prepar
mysql sp 練習遊標和預編譯
prepare book from oop hand locate exist ont alloc create procedure Jack_count_cur_dual() BEGIN DECLARE tb_name VARCHAR(50); DECLARE done
filter 用於對請求和響應進行預處理操作
filter 用於對請求和響應進行預處理操作 一個 filter 可以針對多個請求做過濾,url mapping 配置為 /* 自定義 filter 需要實現 Filter 介面,預處理工作在 doFilter 中完成 1. 強制轉換 re
js中的預編譯和作用域鏈
JavaScript執行三部曲 指令碼執行js引擎都做了什麼呢? 語法分析 預編譯 解釋執行 1.語法分析分析語法是不是錯了 2,在語句執行的時候會進行預編譯 3.在編譯完了進行語句執行 下面就是編譯的主要步驟 三。預編譯的過程(分四步): 1.
[Wannafly挑戰賽28][B msc和mcc][預處理+列舉]
連結:https://ac.nowcoder.com/acm/contest/217/B來源:牛客網 msc和mcc 題目描述 msc和mcc是一對好朋友,有一天他們得到了一個長度為n的字串s. 這個字串s十分妙,其中只有’m’,’s’和’c’三種字元。 定
JavaScript 詳解預編譯原理(和其他語言很不一樣)
JavaScript 預編譯原理 今天用了大量時間複習了作用域、預編譯等等知識 看了很多博文,翻開了以前看過的書(好像好多書都不會講預編譯) 發現當初覺得自己學的很明白,其實還是存在一些思維誤區 (很多博文具有誤導性) 今晚就整理了一下凌亂的思路 先整理一下預編譯的知識吧,日後有時間再把作用
C語言檔案操作 和 預編譯命令
//read檔案 int main(){ char *path = "D:\\friends.txt"; FILE *fp = fopen(path, "r"); char buff[500]; while (fgets(buff,50,fp)){ printf("%s\n", b