2012-03-13 69 views
1

我讀外部的C代碼定義,我發現下面的代碼行:只有1參數

#define __MAIN_C__ 

其中#define給出僅一個「參數」(即__MAIN_C__)。

這只是一個佔位符,還是它可以有一個函數?

+0

你可能想閱讀更多的關於[C預處理器(HTTP一點://en.wikipedia。組織/維基/ C_preprocessor)。 – 2012-03-13 16:38:27

+0

應該指出,'__MAIN_C__'不是應用程序使用的合法標識符。它被保留用於執行。 – 2012-03-13 17:09:06

+0

@R:你能提供更多的細節嗎? – Randomblue 2012-03-13 17:10:51

回答

3

#define將定義__MAIN_C__到沒有值(感謝n.m.和一個簡單的測試程序)。當你不需要關心它的定義時,這是一個快捷方式,當你需要某些東西時#defined。在這種情況下,在你的代碼的某個地方,你可能只看到:

#ifdef __MAIN_C__ 

而且因爲它的定義(也許是非零),不關心它有什麼具體的價值,只要。

你會經常看到這樣的include guards,像這樣:

#ifndef MYHEADER_H 
#define MYHEADER_H 

// stuff here 

#endif 

這類似於在編譯標誌這樣做:

gcc -D__MAIN_C__ main.c 

如果你想看到它定義到什麼都不試試,編譯​​這個,看它失敗:

#include <stdio.h> 

#define TEST 

int main(int argc, char *argv[]) 
{ 
    printf("%d\n", TEST); 
    return 0; 
} 
+3

不,它不會是1. – 2012-03-13 16:38:34

+0

@n.m .:它會是什麼? – Randomblue 2012-03-13 16:41:46

+0

@ n.m。謝謝,剛剛驗證 - 它的字面意思是沒有定義,但定義。 – 2012-03-13 16:42:27

1

是的,這可以完成索姆ething。如果你看,有一個相當不錯的機會,你會發現這樣的:#ifdef __MAIN_C__某處 - 這只是檢查符號是否已被定義,無論給定的值(如果有的話)。

1

定義在這種情況下只需設置MAIN_C。沒有賦值,但預處理器將MAIN_C作爲「true」。一般情況下,像定義這些被用於包括或編譯之前排除代碼,使用類似以下內容:

#define WIN32 

#ifdef WIN32 
//some win32-specific code 
#else 
//some other code 

#endif 
+0

不,它不會將它設置爲1. – 2012-03-13 16:43:32

+0

我知道。我在發佈並糾正之後立即意識到了這一點。接得好。 – Fopedush 2012-03-13 16:49:45

0

這一定義__MAIN_C__擴大(粗略地講)不了了之。

一個可能的用途:

#ifdef __MAIN_C__ 
foo(bar); 
#endif 

還有一句:

#ifdef PLAIN_OLD_OS 
#define __MAIN_C__ 
#else 
#define __MAIN_C__ __os_specific_attribute(dllsomething) 
#endif 

__MAIN_C__ int main (int argc, char* argv[]) {