1. 程式人生 > >gcc -D選項的作用

gcc -D選項的作用

gcc -D選項在man中的說明如下:

 -D name
           Predefine name as a macro, with definition 1.


       -D name=definition
           The contents of definition are tokenized and processed as if they
           appeared during translation phase three in a #define directive.  In
           particular, the definition will be truncated by embedded newline
           characters.


           If you are invoking the preprocessor from a shell or shell-like
           program you may need to use the shell’s quoting syntax to protect
           characters such as spaces that have a meaning in the shell syntax.


           If you wish to define a function-like macro on the command line,
           write its argument list with surrounding parentheses before the
           equals sign (if any).  Parentheses are meaningful to most shells,
           so you will need to quote the option.  With sh and csh,
           -D’name(args...)=definition’ works.


           -D and -U options are processed in the order they are given on the
           command line.  All -imacros file and -include file options are
           processed after all -D and -U options.

簡單點說,加上-D選項就是在編譯時增加對-D後面的巨集的定義。來看個簡單的例子吧,源程式(a.c)如下:

#include <stdio.h>

int main(int argc, char *argv[])
{
#ifdef MYDEBUG
	printf("test\n");
#endif
	printf("hello world\n");

	return 0;
}

編譯及輸出如下:

[[email protected] #9]#gcc -DMYDEBUG -g -o a1 a.c       @1
[[email protected] #11]#./a1
test
hello world
[

[email protected] #12]#gcc -DDEBUG -g -o a2 a.c           @2
[[email protected] #13]#./a2
hello world
[[email protected] #14]#gcc -g -o a3 a.c                            @3
[[email protected] #15]#./a3
hello world

可見,第2和第3條編譯指令的輸出結果是一樣的,為什麼呢?

先看@1,因為源程式中有條件判斷,是否定義了巨集“MYDEBUG”,而該編譯指令中剛好帶了"MYDEBUG",所以就輸出了“test";

接著看@2, 編譯指令中-D後是”DEBUG“,這個針對”#ifdef MYDEBUG"而言就是false,所以就不會輸出“test";

最後看@3, 編譯指令中無-D選項,所以也不會輸出”test"。

這樣做比較,相信大家都明白這個-D的含義了吧。不信,就親自動手試試吧。

相關推薦

gcc -D選項作用

gcc -D選項在man中的說明如下:  -D name            Predefine name as a macro, with definition 1.        -D name=definition            The contents o

gcc -D選項 編譯時新增巨集定義

程式例項: #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { #ifde

gcc優化選項解析

函數 sed forward 普通 函數參數 處理器 空間 style war 1 -fno-defer-pop 函數返回的時候,就立即將棧裏面放置的該函數的參數pop出來。這樣可以避免函數參數占用過多的棧空間。 2 -fforward-propagate ? 3 -ffp

GCC 優化選項 -O1 -O2 -O3 -OS 優先級,-FOMIT-FRAME-POINTER(O3的優化很小,只增加了幾條優化而已)

reorder you alias form when must deb off cif 四種編譯優化類型的解釋: `-O ‘ `-O1 ‘ Optimize. Optimizing compilation takes

shell 指令碼中set -e選項作用範圍

        編寫shell指令碼沒多久,對於其許多命令的具體用法還不太熟悉。最近剛好有需求,就嘗試用指令碼去實現。其中就有用到set -e選項。         在用這個命令之前,也查過其功能,描述比較簡單:就是當命令以非零狀態退出時,則退出shell。主要作用是,當指令

gcc編譯選項-Wl

-Wl選項告訴編譯器將後面的引數傳遞給連結器。 -soname則指定了動態庫的soname(簡單共享名,Short for shared object name) -Wl 表示後面的引數也就是-soname,libhello.so.1直接傳給聯結器ld進行處理

linux gcc連結選項詳解

-I(大寫i) -L(大寫L) -l(小寫l) (1)-l -I(大寫i) 顯示指定標頭檔案的搜尋路徑。

Init.d作用以及如何配置服務自啟動(mysql踩坑集錦)

我用的第三種方法安裝的,這些坑困住了我2天,真心煩,好在都解決了。 坑1:第一個錯誤應該是報的  mysqld: Can't create directory '/usr/local/mysql/data/'  這問題是我自己把mysql目錄裝在了別的目錄,沒有安

PHP 配置檔案中open_basedir選項作用

如下是php.ini中的原文說明以及預設配置: ; open_basedir, if set, limits all file operations to the defined directory ; and below. This directive makes most sense if used in

PHP 配置檔案中open_basedir選項作用防止下載漏洞

open_basedir: 將使用者可操作的檔案限制在某目錄下 如下是php.ini中的原文說明以及預設配置:  ; open_basedir, if set, limits all file operations to the defined directory  ; a

(轉載)gcc編譯選項總結

轉載自:https://blog.csdn.net/gatieme/article/details/21389603 常用編譯選項 gcc and g++分別是gnu的c & c++編譯器 gcc/g++在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案[前處理器cpp] 2.將預處

java程式啟動引數-D作用

java程式啟動引數 -D是用來做什麼的呢?去查詢了一下官方解釋: Set a system property value. If value is a string that contains spaces, you must enclose the s

gcc -m32選項

gcc提供了編譯選項可以為指定架構生成彙編程式碼, 比如 linux下  -m32 生成32位機器的彙編程式碼; -m64則生成64位機器彙編程式碼; 由於64位機器的暫存器比32位機器多很多,

GCC常用選項

GCC 常用選項 -v:檢視版本號 -I:指定標頭檔案所在目錄(大寫的i) -c:只編譯成.o檔案,不進行連結 -g:包含除錯資訊,方便使用gdb進行除錯 -On:n=0~3,編譯優化,n越大優化層次越深 -Wall:提示更多告警資訊 -D:編譯時定義巨集 -E

Makefile中用巨集定義進行條件編譯(gcc -D)/在Makefile中進行巨集定義-D

在原始碼裡面如果這樣是定義的: #ifdef   MACRONAME //可選程式碼 #endif 那在makefile裡面 gcc   -D   MACRONAME=MACRODEF 或者 gcc   -D   MACRONAME  這樣就定義了預處理巨集,編譯的時候可選程式碼就會被編譯進去了。 對於G

Gcc 優化選項注意事項

Gcc -O0 不優化,-O1 -O2 -O3對程式碼進行了優化,減小目標檔案大小,減小程式碼段及棧空間的大小,同時也會帶來一些意想不到的問題,所以良好的程式設計風格和規範至關重要,避免型別直接來回轉換,進可能用小記憶體表示,而且不同平臺要求4或8位元組對齊。 如: 1、函

linux64平臺上編譯32位程式: GCC編譯選項 -m64 -m32 -mx32

x86-64 與 IA-64 x86-64一般稱為AMD x86-64,難道x86-64不是Intel首先搞出來的指令集麼?這回的確是AMD乾的,但是用的是Intel 16bits升到32bits向下相容的套路。大致是這樣的: x86:從1978年來的8086處理器開

gcc常用選項及常見的檔案格式,副檔名

gcc常用選項 編譯過程 預處理,編譯,彙編,連結 gcc的選項(必須分開給出) -x 語言名 指出後面檔案的語言 -c 編譯,彙編原始檔,生成目標檔案 -S 編譯不彙編,生成彙編檔案 -E 預處理,輸出送到標準輸出 -o 指定輸出的檔名

Makefile使用-D選項更改巨集定義,記得要clean

1、Makefile檔案,如下 CC_OPTS += -DMakefle_D=2 all:testD echo "done" testD:testD.c gcc testD.c -o testD $(CC_OPTS) 2、testD.c檔案,如下

gcc 編譯選項

摘自http://blog.csdn.net/liuchao1986105/article/details/6674822 版本] -0.13   [宣告]   這篇文件是我的關於gcc引數的筆記,我很懷念dos年代我用小本子,紀錄任何的dos 命令的引數.哈哈,下面的