1. 在C語言中 宏定義是什麼
在C語言源程序中,允許用一個標識符來表示一個字元串,稱為宏,宏定義是由源程序中的宏定義命令完成的,宏替換是由預處理程序自動完成的。宏定義是C提供的三種預處理功能的其中一種,這三種預處理包括:宏定義、文件包含、條件編譯。
宏(Macro),是一種批量處理的稱謂。計算機科學里的宏是一種抽象,它根據一系列預定義的規則替換一定的文本模式。
計算機語言如C語言或匯編語言有簡單的宏系統,由編譯器或匯編器的預處理器實現。C語言的宏預處理器的工作只是簡單的文本搜索和替換,使用附加的文本處理語言如M4,C程序員可以獲得更精巧的宏。
2. c語言中的「宏」是指什麼
是一種批量處理的稱謂。計算機科學里的宏是一種抽象(Abstraction),它根據一系列預定義的規則替換一定的文本模式。
「宏」這個詞的使用暗示著將小命令或動作轉化為一系列指令。
計算機語言如C語言或 匯編語言有簡單的宏系統,由編譯器或匯編器的預處理器實現。C語言的宏預處理器的工作只是簡單的文本搜索和替換,使用附加的文本處理語言如M4,C程序員可以獲得更精巧的宏。
在Objective-C語言源程序中,允許用一個標識符來表示一個字元串,稱為宏,被定義為宏的標識符稱為宏名。在編譯預處理時,對程序中所有出現的宏名,都用宏定義中的字元串去替換,這稱為宏替換或宏展開。
宏定義是由源程序中的宏定義命令完成的,宏替換是由預處理程序自動完成的。在Objective-C語言中,宏分為有參數和無參數兩種。
(2)c語言編譯中怎麼看定義了哪些宏擴展閱讀
A類宏是用G65 Hxx P#xx Q#xx R#xx或G65
Hxx P#xx Qxx
Rxx格式輸入的,xx的意思就是數值,是以um級的量輸入的,比如你輸入100那就是0.1MM #xx就是變數號,變數號就是把數值代入到一個固定的地址中,固定的地址就是變數。
一般OTD系有#0~#100~#149~#500~#531.關閉電源時變數#100~#149被初始化成「空」,而變數#500~#531保持數據。我們如果說#100=30那麼現在#100地址內的數據就是30了。
B類宏能完成某一功能的一系列指令像子程序那樣存入存儲器,用戶可以設定M、S、T、G代碼調用它們,使用時只需給出這個指令代碼就能執行其功能,也可以像調用子程序一樣使用。
3. 求C語言中預編譯命令表
1 宏定義即是字元串替換。宏分為無參宏和含參宏。定義宏的位置可以在函數外部也可以在函數內部(vc++ 2008 測試通過)。宏的作用域是從定義處到取消定義命令[#undef 宏名]之間的部分,若無顯式的#undef命令則默認到文件結束。可以使用defined命令可以判斷宏是否被定義#if defined X (=#ifdef X),#if !defined X (= ifndef X)。 定義含參宏格式如#define SQ(y) ((y)*(y)),其中參數為y,宏得到的是y平方。為了保證宏替換的正確性,多加了3個括弧。但這樣的保證也是有限的,它要求y的值不能在(y)內改變,如把y換成i++將得不到期望的結果。 宏調用(實際上是宏替換)不用考慮形參的類型,這帶來一定的好處。如求兩個數最大值的宏#define MAX(a,b) (a>b)?a:b,實參可以是int,double等。宏定義可以包括多個語句,如#define CHANGE(X1,X2,X3,X4) X1 += 1;X2 += 2; X3 += 3; X4 +=4; 2 文件包含命令#include的功能是把指定的文件插入該命令行位置取代該命令行,從而把指定的文件和當前的源程序文件連成一個源文件。 源代碼分布於多個文件時,建議使用調用文件+頭文件+實現文件的模式。頭文件中包含要用到的函數說明,類型定義,宏定義,常數值等。具體的實現放在實現文件中。在調用文件和實現文件中都包含該頭文件即可。為了避免重復包含頭文件,可在頭文件中使用#ifndef [頭文件標示符(如X_Header等等)] + 頭文件內容 + #endif模式。 3 條件編譯命令可以按不同的條件去編譯不同的程序部分,因而產生不同的目標代碼文件。 這對於程序的移植和調試很有用。條件編譯有三種形式,下面分別介紹:
第一種形式根據有無對應宏定義選擇編譯程序段:
#ifdef 標識符 // 或 #ifndef 標示符
程序段1
#else
程序段2
#endif 第二種形式根據常量表達式值選擇編譯,值為非0執行if段。#if 常量表達式
程序段1
#else
程序段2
#endif
這里一定要是常量表達式,一般為宏。若是表達式包含變數則編譯器只能隨便猜一個了。 第三種形式含有#elif,看個例子吧#define ABC 3
void main(){#if ABC>0
int a=1;
printf("%d/n",a);
#elif ABC<0
int b=-1;
printf("%d/n",b);
#else
int c=0;
printf("%d/n",c);
#endif
} 其餘的預編譯命令如下,這里就不研究它們了。#line 標志該語句所在的行號
# 將宏參數替代為以參數值為內容的字元竄常量
## 將兩個相鄰的標記(token)連接為一個單獨的標記
#pragma 說明編譯器信息#warning 顯示編譯警告信息
#error 顯示編譯錯誤信息
4. 如何快速查找C語言代碼中的宏的值
很多的系統,代碼量超大,在我們閱讀其代碼的時候,往往macro能決定代碼執行的具體分支。利用find grep查找起來會特別慢,而且不一定能找到正確的值。如果系統是可編譯的,可以利用編譯器的預處理功能很快知道宏的具體值。
方法如下:
在CFLAGS裡面添加 -E 選項。
舉例說明:
在Android 系統裡面,
1. 在Andriod.mk裡面添加-E 參數。
LOCAL_CFLAGS += -E
2.重新編譯,顯示其過程
mm showcommands
3.編譯過程會列印出類似下面的結果。
prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-gcc -I hardware/ttd/marvell/generic/bmm-lib/lib -I out/target/proct/OMS_TTD/obj/SHARED_LIBRARIES/libbmm_intermediates -I system/core/include -I hardware/libhardware/include -I hardware/libhardware_legacy/include -I hardware/ril/include -I dalvik/libnativehelper/include -I frameworks/base/include -I frameworks/base/opengl/include -I external/skia/include -I out/target/proct/OMS_TTD/obj/include -I bionic/libc/arch-arm/include -I bionic/libc/include -I bionic/libstdc++/include -I bionic/libc/kernel/common -I bionic/libc/kernel/arch-arm -I bionic/libm/include -I bionic/libm/include/arch/arm -I bionic/libthread_db/include -c -fno-exceptions -Wno-multichar -msoft-float -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -march=armv5te -mtune=xscale -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -include system/core/include/arch/linux-arm/AndroidConfig.h -I system/core/include/arch/linux-arm/ -mthumb-interwork -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -DNDEBUG -g -Wstrict-aliasing=2 -finline-functions -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -DNDEBUG -UDEBUG -DLOG_DISABLEDEBUG=1 -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -E -MD -o out/target/proct/OMS_TTD/obj/SHARED_LIBRARIES/libbmm_intermediates/bmm_lib.o hardware/ttd/marvell/generic/bmm-lib/lib/bmm_lib.c
其中-o 是生成的文件。
打開這個文件,就是我們預編譯的結果,可以很清晰地看到各個宏的具體值。