
c語言define字串 在 コバにゃんチャンネル Youtube 的最佳解答

Search
利用这个特性你可以将 const 关键字对不支持的编译器隐藏起来。 基础用法. 对象类的宏仅仅为会被替换为定义的代码片段,被称为对象类的宏也是因为其 ... ... <看更多>
#1. [C語法] #define 一個字串@ 不會的就放這邊 - 痞客邦
有時候我們想把一個路徑或一個很長的字串由一個變數做代替, 這時候就可以用#define來定義像以下的範例是我想把123.bin這字串把它定義成BINFILE ...
在C語言中,不少人會利用#define的方式來宣告字串常數(String Constant)。舉個例子: #define strConst "A string constant"
#3. C/C++ 的預處理定義: # , #@ , ## @ 小小科學實驗室 - 隨意窩
如:#define example(instr) printf("the input string @ laser 雷射AVR 自動控制開發系統實用電路C C++ 伺服系統發明專利標準EMI EMC 電子零件電機零件電子特性生物 ...
#define 識別符號替換列表(替換列表可以是數,字串字面量,標點符號,運算子,識別符號,關鍵字,字元常量。注意:替換列表是可以為空的).
#5. Day 21:重溫前置處理器、巨集( #, ## )、預先定義的巨集
30 Days 如何把C 語言偽裝成高階語言OWO / 系列第22 篇 ... 例如常用的 #include 和 #define , ... 放在巨集參數前,展開時中參數兩端加入 " ,使其字串化。
2022年5月2日 — #Define指示詞會使編譯器以標記字串取代原始程式檔中每個出現的識別碼。 ... 如果新定義與原始定義在語法上相同,Microsoft C/C++ 可讓您重新定義巨集 ...
const修飾的不是常量而是readonly的變數,const 修飾的只讀變數不能用來定義陣列的維數,也不能放在case關鍵字後面。 字串巨集常量. 除了定義巨集常數之外 ...
#8. 巨集簡介
前置處理器語言,顧名思義,並不是C 語言的一部份,而是編譯過程中前置處理部份處理的 ... 至目前為止,常使用到的另一個前置處理器指令是 #define ,它本質上是個字串 ...
#9. 巨集字串 - 尋找最初的初衷
??? C 語言規則中, stringify macro 不會去做pre-scane ( 試圖先展開所有的#define ) ...
#10. [C] #Define 相關整理
[C] #Define 相關整理. Define為C語言中在預處理階段對程式碼進行字串替換. 最簡單的define定義. 就是文本替換,例如 #define MAXTIME 1000.
#11. C語言宏的定義和宏的使用方法(#define) - tw511教學網
出現在字串字面量中的宏名稱不會被展開,因為整個字串字麵量算作一個前處理器記號。 無法通過宏展開的方式建立前處理器命令。即使宏的展開結果會生成形式 ...
#12. [C 語言] 程式設計教學:如何使用巨集(macro) 或前置處理器 ...
C 程式碼會經過前置處理器預處理(preprocessing) 過後,再轉給真正的C 編譯器,進行編譯的動作。 預處理在本質上是一種字串代換的過程。前置處理器會將C 程式碼中巨集宣告 ...
#13. C++中巨集定義#define的用法 - IT人
#define命令是C語言中的一個巨集定義命令,它用來將一個識別符號定義為一個字串,該識別符號被稱為巨集名,被定義的字串稱為替換文字。
#14. C 中define用法 - w3c學習教程
#define命令是c語言中的一個巨集定義命令,它用來將一個識別符號定義為一個字串,該識別符號被稱為巨集名,被定義的字串稱為替換文字。 該命令有兩種格式 ...
#15. 你所不知道的C 語言: 前置處理器應用篇 - HackMD
C 語言 重要功能macro 巨集 · stringification: 把expression 變成string · concatenation: 將expression 變成字串並與其他字串連接 · _Generic: 把expression 依據型態轉換 ...
#16. const string vs. #define - c++ - Stack Overflow
Prefer the second option. If you use the first option (preprocessor), you are limiting your flexibility with the object. Consider the following.
#17. C語言巨集定義技巧 - Iver's Blog - 痞客邦
從這轉載來的1,防止一個頭檔被重複包含#ifndef COMDEF_H #define COMDEF_H ... 宏中"#"和"##"的用法一、一般用法我們使用#把巨集引數變為一個字串,用##把兩個巨集引數 ...
#18. c語言中,define命令是什麼意思 - 嘟油儂
串,在巨集時又以內該字串取代巨集名,這容只是一種簡單的代換,字串中可以含任何字元,可以是常數,也可以是表示式,預處理程式對它不作任何檢查。如有錯誤,只 ...
#19. C語言巨集、單井號(#)和雙井號(##) - 程式寫得好,要飯 ...
3) 前加#,將標記轉換為字串。 #define C(x) #x // C(1+1) 等效於"1+1"
#20. 結構(struct)
#include <stdio.h> #include <string.h> void main() { struct ... 這樣的(*(*listOne.next).next).data語法既難寫又難懂, 因此C語言定義了->運算符號。
#21. C語言, define語句的用法。
在字串中含有各個形參。 帶參巨集呼叫的一般形式為:. 巨集名(形參表). 例如:#define m( ...
#22. C 語言程式設計教學講義
四、常見的高階程式語言. ... 一、#define 前置處理器. ... 在C 語言中並沒有字串的資料型態,要使用字串變數,就要宣告『字元陣列』。字串常.
#23. c語言define 怎麼用的,C語言中define是什麼意思 - 第一問答網
c語言define 怎麼用的,C語言中define是什麼意思,1樓大野瘦子有三種用法 ... 巨集定義是用巨集名來表示一個字串,在巨集展開時又以該字串取代巨集名, ...
#24. c語言中函式能呼叫另函式中的define變數嗎
c語言 中函式能呼叫另函式中的define變數嗎,1樓匿名使用者define 是巨集定義, ... 而巨集是在編譯之前由編譯器先替換成要替換的字元或字串的,我感覺 ...
#25. C語言typedef 和define 區別- C語言零基礎入門教程
不使用typedef struct _Person { string name; int age; float height; }; struct _Person person; //C語言中必須新增struct,C++可以不新增struct ...
#26. c語言函式define作用
c語言 函式define作用,1樓仙盼佛define是c語言中的預處理命令, ... 巨集的定義在c或c++語言源程式中允許用一個識別符號來表示一個字串,稱為“巨集”。
#27. c語言define 用法
將C語言的語法概念帶入C#發生問題Define問題資料長度問題. C語言的條件編譯#if, #elif, #else, ... 在C 語言中連線字串和Int. #define #define 的語法如下1 ...
#28. #define_百度百科
define 是C語言和C++ 中的一個預處理指令,其中的“#”表示這是一條預處理命令·。 ... The #define directive substitutes token-string for all subsequent occurrences ...
#29. c語言define 用法
#define 指示詞(C/c + +) 08/29/2019 c o v 本文內容#Define 會建立宏,也就是識別碼或參數化識別碼與標記字串的關聯。 定義巨集之後,編譯器就可以使用語彙基元字串 ...
#30. c 語言define
學習了這麼多年C語言,說實話對宏自以為了如指掌了,沒想到看內核代碼的時候還是那麼吃力,設備驅動 ... #define 沒有權杖字串的會從原始程式檔中移除出現的識別碼。
#31. define c 語言
定義巨集之後,編譯器就可以使用語彙基元字串替代原始程式檔中出現的每個識別項。 語法#define 識別碼token-字串opt. C語言typedef – C語言教學. 在C語言中,若是遇到 ...
#32. C語言中define如何拼接兩個宏定義 - 櫻桃知識
1 匿名用戶. 拼接不了的,但是這樣可以達到你的目的 · 2. #define CONNECT2(x, y) x##y · 4 匿名用戶. 宏定義的字符串都是有""包含的 · 5 灰太狼當家. # ...
#33. define在C语言中的用法 - 大大通
define 叫做宏定义命令,它也是C语言预处理命令的一种。所谓宏定义,就是用一个标识符来表示一个字符串,如果在后面的代码中出现了该标识符, ...
#34. c define 換行
C 语言 之#define 用法#define 是C 语言中提供的宏定义命令, 其主要目的是为程序员在编程 ... 也由於C 語言中的字串是字元的陣列,所以如果我們要知道第N 個字元,就是 ...
#35. C 語言:typedef 的用法 - 傑克! 真是太神奇了!
C 語言 中typedef 可以用來擴充C 原有的資料型態. 通常我們會將某個資料型 ... (我們希望的是字串比較時不要去動到字串的內容, 而不是指標值不能更動) ...
#36. C語言#define的妙用 - 人人焦點
目錄初識C語言C語言概述數據類型變量常量字符串轉義字符注釋選擇循環語句函數數組操作符常見關鍵字#define定義常量和宏指針結構體初識C語言初識C語言, ...
#37. define宏定義的基本用法與原理 - 台部落
宏定義的用法一、#define的基本用法#define命令是C語言中的一個宏定義 ... 則,char *string = change2string(123),變成了char *string = "123"。
#38. C++ Strings - Tutorialspoint
C++ provides following two types of string representations −. The C-style character string. The string class type introduced with Standard C++.
#39. c語言#define、c++ #define - 香腸炒章魚- 痞客邦
Example Source Code:c/c++語言建立#define,先建立define_.h 檔。 #define INT_TEST 10 #define INT__ 123 #define.
#40. define 用法c
C語言 中define的用法總結– IT閱讀. 1.簡單的巨集定義. #define 識別符號替換列表(替換列表可以是數,字串字面量,標點符號,運算子,識別符號,關鍵字,字元常量。
#41. C語言之define與typedef有什麼區別? - 每日頭條
typedef是在C語言中用來為複雜的聲明定義簡單的別名,它本身是一種存儲 ... 第一行代碼const char *p1=string; //第二行代碼const pStr p2 = string; ...
#42. C 語言中檢查字串是否包含子字串 - Delft Stack
但請注意,這個函式會忽略兩個字串的大小寫。 C. cCopy #define _GNU_SOURCE #include ...
#43. define用法- C/C++宏字符串連接
c++ ## (2). #define STR1 "s" #define STR2 "1" #define STR3 STR1 ## STR2. 是否可以連接STR3 ==“s1”? 您可以通過將參數傳遞給另一個宏函數來完成此操作。
#44. 宏定義 - 華人百科
中文名稱. 宏定義 · 格式. #define 標識符 字元串, · 歸屬門類. 電腦C語言 · 功能. 預處理功能 · 別名. 宏代換 ...
#45. c 中define - Blaise
C語言 中,可以用#define 定義一個標識符來表示一個常量。 ... + +) 08/29/2019 c o v 本文內容#Define 會建立宏,也就是識別碼或參數化識別碼與標記字串的關聯。
#46. C中define的#和##_quantum6的技术博客
比如说:两个字串直接合并:#defineTEXT"a""b"展开之后,结果就是"ab"参数字 ... #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时 ...
#47. C語言中的define預處理指令老手都是這樣用,你全都掌握了嗎?
帶引數宏定義的一般形式為:#define 宏名(形參表) 字串如定義一個求兩個量的乘積的帶引數宏,可以按如下形式定義:#define MULTIPLY(a,b) ...
#48. c語言中defineN15是什麼意思 - 好問答網
在編譯預處理時,對程式中所有出現的“巨集名”,都用巨集定義中的字串去代換,這稱為“巨集代 ... c語言#define n 10 是什麼意思初學者不懂請大神詳解.
#49. C/C++中巨集定義(#define) - IT閱讀
#define命令是C語言中的一個巨集定義命令,它用來將一個識別符號定義為一個字串,該識別符號被稱為巨集名,被定義的字串稱為替換文字。
#50. c語言define陣列 - 軟體兄弟
4) Keep going left and find: int *p[]; ^^^, "p is array of pointer to ..., #include <stdio.h>. #include <string.h>. #define S "I am kevin." int main().
#51. C語言程式設計之預處理過程與define及條件編譯 - IT145.com
這兩個對於前處理器要看前處理器把這個替換體看成什麼。如果是字元型字串,這空格也會是字串的一部分。但如果是記號型字串,空格就會被認為是分隔符,就和 ...
#52. C與言筆記-宏定義define 的注意事項與陷阱 - 技術雜記
C與言筆記-宏定義define 的注意事項與陷阱 ... C語言技術 ... 自動刪除超過字串usStackDepth :任務的棧大小pvParameters :傳遞給任務的參數uxPriority ...
#53. 但經常會看到庫裡面有時會寫一大堆的單行的define定義
#define命令是C語言中的一個宏定義命令,它用來將一個識別符號定義為一個字串,該識別符號被稱為宏名,被定義的字串稱為替換文字。
#54. 8. 關於C 語言的前置處理器#define,下列何者敘述正確? (A ...
關於C 語言的前置處理器#define,下列何者敘述正確? (A)可以定義常數 (B)可以定義字串 (C)可以定義巨集 (D)以上皆是. 編輯私有筆記及自訂標籤.
#55. C語言巨集的定義和巨集的使用方法(#define) - 拾貝文庫網
在C 語言中,可以採用命令#define 來定義巨集。該命令允許把一個名稱指定成 ... 出現在字串字面量中的巨集名稱不會被展開,因為整個字串字面量算作一個前處理器記號。
#56. 字串- JavaScript - MDN Web Docs
C 語言 的開發者有 strcmp() 函式可以用來比較字串。 ... /*globals define*/ // Assumes all supplied String instance methods already present ...
#57. C/C++ 中的define 和typedef - PzNotes - Learning and Sharing
利用这个特性你可以将 const 关键字对不支持的编译器隐藏起来。 基础用法. 对象类的宏仅仅为会被替换为定义的代码片段,被称为对象类的宏也是因为其 ...
#58. Re: 使用c18定義時#define常數的疑問及pragma romdata疑問
const 是用來定義不會被改變的數一般稱之為常數,在Hi-Tech PICC 及C18裡,常用來宣告它是存放在Flash ROM 的查表值,例如lcd顯示的固定字串,SIN ...
#59. 變數與基本資料型別
C 語言 提供結構資料型別,來處理陣列、字串、結構,至於 ... 宣告符號常數可以使用前置處理命令#define 來定義,也可以在程式中使用const 來.
#60. C语言宏定义##连接符和#符的使用 - CSDN
关于#和## 在c语言的宏中,#的功能是将其后面的宏参数进行字符串化 ... 如定义好#define STRING(x) #x之后,下面二条语句就等价。 char *pChar ...
#61. 十三誡增修--09:慎用Macro(#define) - 看板C_and_CPP
根據C standard 6.10.3.4, 如果某macro的定義裡裏面含有跟此macro名稱同樣的的字串, 該字串將不會被預處理。 所以: #define pr(n) ((n==1)? 1 ...
#62. [C] #define 原來很神奇 - 金石微開
在C 語言中前置處理器(Preprocessor)有一個#define命令,可以用來取代字串。 以下程式輸出的結果為7,-1 , WTF ~_~ ,Tell me why?
#63. C语言define 定义函数 - 猿说编程
C语言define 定义函数- 语言中,除了可以用#define 定义一个标识符来表示一个 ... #include <stdio.h> #include <stdlib.h> #include <string> #define ...
#64. #define用法,C语言#define详解 - C语言中文网
是不是与定义变量类似?但是要区分开!变量名表示的是一个变量,但宏名表示的是一个常量。可以给变量赋值,但绝不能给常量赋值。 宏所表示的常量可以是数字、字符、字符串 ...
#65. 第16章C前處理器和C庫16.3 在#define中使用引數 - 程式前沿
假設您確實希望在字串中包含巨集引數,ANSI C 允許您這麼做。在類函式巨集的替換部分中,#符號用作一個預處理運算子,它可以把語言符號轉化為字串。
#66. typedef和define的詳細區別
typedef是c語言語句,其功能是使用者為已有資料型別取“別名”。 例如:1. typedefintinteger;. 這以後就可用integer來代替int作整 ...
#67. C語言宏定義#define的理解與資料整理!希望你能get到!
但一定要注意const修飾的不是常量而是readonly 的變數,const 修飾的只讀變數不能用來作為定義陣列的維數,也不能放在case 關鍵字後面。 2.利用define來定義字串宏常量.
#68. 類別結構— (Define Class) | 高等C語言
如果我們要實作出像Java 或C# 一樣的物件導向作法,應該將類別的結構獨立出來,這樣會比較能夠規模化,而且通常可以節省記憶體。 在以下的程式中,我們將再度用C 語言實 ...
#69. c語言中define巨集定義和變數定義的聯絡和區別 - 優幫助
巨集定義#define eot 1 << 0是規定在預編譯時,把下面程式中遇到的詞eot 用字串1 << 0 替代。 所以不能換成 ...
#70. C語言中宏定義#define用法總結。
1.簡單的宏定義#define 標識符其他清單(其他清單可以是數,字串字面量,標點符號,運算子,標識符,關鍵字,字元常量。注意:其他清單是可以為空白 ...
#71. c define 換行C - Mtlpe
在C語言的#define中,初學者在剛用scanf函數輸入時,t_100,下面是一個最簡單的C ... 第一部分:預處理指令#define,如果我們要做字串的比對,例如第一個C 程式第一個C ...
#72. C語言中#define的用法 - 程式師世界
define 是C語言中的預處理命令,它用於宏定義,可以提高源代碼的可讀性,為 ... 宏的定義在C或C++語言源程序中允許用一個標識符來表示一個字符串,稱 ...
#73. define 巨集指令應用、頭文件、typedef、後綴修飾、inline
我們在 《筆記》C語言- 06:一維陣列、#define、函式與陣列、static 陣列 ... bit value */ typedef char* String; String str = "This is a string !
#74. c語言中define巨集定義和變數定義的聯絡和區別 - 多學網
巨集定義#define eot 1 << 0是規定在預編譯時,把下面程式中遇到的詞eot 用字串1 << 0 替代。
#75. [C語言] #define
#define CONCAT(x,y) x##y // concatenate x & y #define ToChar(x) #@x // change x into char #define ToString(x) #x // change x into string
#76. C 语言typedef 与#define 比较 - 菜鸟教程
这是预处理器用BYTE 替换unsigned char。 但也有#define 没有的功能,例如: typedef char * STRING;. 编译器把STRING 解释为一个类型的表示符 ...
#77. Python中有沒有類似c語言中define的功能 - 貝塔百科網
Python中有沒有類似c語言中define的功能,1樓匿名使用者首先python是動態語言,不用宣告變數的型別所以define uchar unsigned char 這個沒有版。 d.
#78. C/C++ #define 宏定义- GuoXinxin - 博客园
define 命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。 定义宏的作用一般是 ...
#79. C語言中的#define是什麼意思,有什麼作用,怎樣用? - 劇多
#define叫做預處理宏定義命令,它的具體作用,就是方便程式段的定義和修改,提高程式的執行效率。 無參宏定義中,一般形式為:#define?識別符號?字串.
#80. c語言定義常量為什麼不建議用define - 極客派
c語言 的常量就bai是使用#define定義的。 ... #define a 3 是在程式正式編譯前,做token a 的字串替代,凡token a 都用3替代, 替代完了再開始編譯。
#81. C語言define巨集定義的常量計算 - 就問知識人
C語言define 巨集定義的常量計算,1樓周大個子7zx1x2552527巨集定義就是直接代入沒有括號 ... #define a 3 是在程式正式編譯前,做token a 的字串替代, ...
#82. c define用法
C語言 中,可以用#define 定義一個標識符來表示一個常量。 ... + +) 08/29/2019 c o v 本文內容#Define 會建立宏,也就是識別碼或參數化識別碼與標記字串的關聯。
#83. Python 定義(define)、type() - ya06061的部落格- 痞客邦
相較於C語言,在Python 中定義變數是較自由的, 它在一開始不用設定其的型 ... 所以你只要直接打一個名字並在後面設定其值(不管事數字還是字串)就算是 ...
#84. #請益C語言#define的問題 - 軟體工程師板 | Dcard
問題,請益,程式語言,C語言. ... #define的註解也說明了ENTER的ASCII碼為13 如果你輸入的字串為"13"對照ASCII表會出現'1' = 49 '3' = 51.
#85. C++中#define(預編譯)的使用方法 - Cotpear
C ++中#define(預編譯)的使用方法. 2020-2-03 13:49 ... 有哪些種類. #define. 範例: #define A B 定義名稱A 為B ... C++將字串重複N次— string 函式.
#86. C++ - 維基百科,自由的百科全書
C ++提供69個標準表頭,其中19個不再贊成使用。 使用標準模板庫(例如:使用 std::vector 或 std::string 來取代C風格的陣列或字元陣列 ...
#87. C/C++ - 常見C 語言觀念題目總整理(適合考試和面試) - Mr ...
存儲方式: define 直接展開不會分配記憶體,const 則會在記憶體中分配。 五、關鍵字volatile. 由於嵌入式系統常處理I/O、中斷、即時操作系統( ...
#88. C語言中的宏#define - 壹讀
C語言 中提供的宏定義命令是#define。 ... #include <stdlib.h> #include <string.h> #include <stdio.h> #define num 10 #define f(x) #x #define ...
#89. C語言#define指令 - 億聚網
define 預處理器指令用於定義常量或微替代。它可以使用任何基本數據類型。 語法: #define token value 下面來看看一個使用#define來定義一個常量的例子.
#90. C語言- #define的operator - 迷你馬坊
C語言 - #define的operator. C語言的巨集參數(macro parameter)有一些特殊符號, ... 將實際對應的參數封裝進""之間,變成字串。
#91. [C/C++] #define 語法練習 - 個人新聞台
define 說實在打ACM 題目是只有常數還蠻常使用的,而在線上賽code force, ... 使用# 前綴傳參數,或者打在#define 中,則會轉字串(加入雙引號)
#92. Oscar 的韌體工程師學習筆記: #define 簡單心得記錄
用過C語言的人都知道#define 是用來定義巨集(macro),基本用法如下 ... 如果在#define裡面#及##有特殊的用法,#會將接在後面的參數轉成string。
#93. C++如何使用define关键字以便使用中文编程? - 知乎专栏
先上代码: #include <iostream> #define 使用using #define 整型int ... 字符串string /* * 这是一个使用define关键字用中文定义C++关键字的程序。
#94. c語言define作用範圍,#define的作用(C語言)
1.#define 的作用在C或C++語言源程式中允許用一個識別符號來表示一個字串,稱為“宏”。被定義為“宏”的識別符號稱為“宏名”。在編譯...
#95. Arduino 基本語法筆記 - 小狐狸事務所
此外, 也可以用前置指令define 定義一個常數或巨集(運算式). ... Arduino 裡的字串可以用兩種方法來做, 一是用C 語言本來就有的char 類型的陣列; ...
#96. 關於C語言define的一個問題 - 優美
define 是C語言中的預處理命令,它用於宏定義,可以提高原始碼的可讀 ... 宏的定義在C或C++語言源程式中允許用一個識別符號來表示一個字串,稱為“宏”。
#97. c語言define C語言#define指令 - Steur
應用廣泛。c語言的設計目標是提供一種能以簡易的方式編譯,#define也是其中一種,那么就全部替換成指定的字符串。 我們先通過一個例子來看一下#define 的用法: ...
#98. C語言基礎必修課(涵蓋「APCS大學程式設計先修檢測」試題詳解)(電子書)
字串 置換和巨集定義功能:使用#define 前置處理指示詞,可以將程式中經常使用的常數、字串、函式以巨集名稱取代,直到使用#undef 取消為止。 3.
c語言define字串 在 十三誡增修--09:慎用Macro(#define) - 看板C_and_CPP 的推薦與評價
誡9改了很多,有錯請告知....
========================================================
09. 慎用macro(#define)
Macro是個像鐵鎚一樣好用又危險的工具:
用得好可以釘釘子,用不好可以把釘子打彎、敲到你手指或被抓去吃子彈。
因為macro 定義出的「偽函式」有以下缺點:
(1) debug會變得複雜。
(2) 無法遞迴呼叫。
(3) 無法用 & 加在 macro name 之前,取得函式位址。
(4) 沒有namespace。
(5) 可能會導致奇怪的side effect或其他無法預測的問題。
所以,使用macro前,請先確認以上的缺點是否會影響你的程式運行。
替代方案:enum(定義整數),const T(定義常數),inline function(定義函式)
C++的template(定義可用不同type參數的函式),
或C++11開始的匿名函式(Lambda function)與constexpr T(編譯期常數)
以下就針對macro的缺點做說明:
(1) debug會變得複雜。
編譯器不能對macro本身做語法檢查,只能檢查預處理(preprocess)後的結果。
(2) 無法遞迴呼叫。
根據C standard 6.10.3.4,
如果某macro的定義裡裏面含有跟此macro名稱同樣的的字串,
該字串將不會被預處理。
所以:
#define pr(n) ((n==1)? 1 : pr(n-1))
cout<< pr(5) <<endl;
預處理過後會變成:
cout<< ((5==1)? 1 : pr(5 -1)) <<endl; // pr沒有定義,編譯會出錯
(3) 無法用 & 加在 macro name 之前,取得函式位址。
因為他不是函式,所以你也不可以把函式指標套用在macro上。
(4) 沒有namespace。
錯誤例子:
#define begin() x = 0
for (std::vector<int>::iterator it = myvector.begin();
it != myvector.end(); ++it) // begin是std的保留字
std::cout << ' ' << *it;
改善方法:macro名稱一律用大寫,如BEGIN()
(5) 可能會導致奇怪的side effect或其他無法預測的問題。
錯誤例子:
#include <stdio.h>
#define SQUARE(x) (x * x)
int main()
{
printf("%d\n", SQUARE(10-5)); // 預處理後變成SQUARE(10-5*10-5)
return 0;
}
正確例子:在 Macro 定義中, 務必為它的參數個別加上括號
#include <stdio.h>
#define SQUARE(x) ((x) * (x))
int main()
{
printf("%d\n", SQUARE(10-5));
return 0;
}
不過遇到以下有side effect的例子就算加了括號也沒用。
錯誤例子: (感謝 yaca 網友提供)
#define MACRO(x) (((x) * (x)) - ((x) * (x)))
int main()
{
int x = 3;
printf("%d\n", MACRO(++x)); // 有side effect
return 0;
}
備註:
C++11開始支援匿名函式(Lambda function),可視情況使用。
補充資料:
- https://stackoverflow.com/questions/14041453/why-are-preprocessor-
macros-evil-and-what-are-the-alternatives
- https://stackoverflow.com/questions/12447557/can-we-have-recursive-macros
- C11 Standard 6.10.3.4
- https://en.cppreference.com/w/cpp/language/lambda
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.128.143.228
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1463986797.A.CC6.html
... <看更多>