簡體   English   中英

C 預處理器包含指令

[英]C Preprocessor include directive

當我包含另一個源(即stdio.h )時,預處理器是否足夠智能以僅包含我在代碼中使用的函數?

示例:假設這個小程序只包含我正在使用的內容,以及 printf 函數使用的內容,遞歸地包含它們,但是更大的程序呢?

#include <stdio.h> 

int main(void) {
   printf("Hello World\n"); 
   return 0;
}

不,恰恰相反:

#include執行文本替換:它打開文件並將其所有內容1復制到您的主 C 文件中。 在此過程中,它執行包含文件中的所有預處理器指令。 除其他事項外,這意味着它將遞歸地包含 header 中#include d 的所有文件。

#include不知道也不關心你最終使用了包含文件的哪一部分。


1如前所述,預處理器指令在包含的文件執行。 這可以修改包含的內容。 例如,假設以下 header 文件header.h

#ifndef HEADER_H
#define HEADER_H

#ifdef NDEBUG
#  define LOG(...) ((void) 0)
#else
#  define LOG(...) log_message(__FILE__, __LINE__, __VA_ARGS__)

inline void log_message(const char* filename, int line, ...) {
    // Logging code omitted for brevity.
}
#endif

// other stuff

#endif

現在,如果您的main.c文件如下所示:

#define NDEBUG
#include "header.h"

int main(void) {
    // …
    LOG("hello");
}

……然后,在預處理之后,您的main.c文件將如下所示(我省略了一些不相關的內容):

# 1 "main.c"

# 1 "./header.h" 1




# 13 "./header.h"

// other stuff


# 3 "main.c" 2

int main(void) {
    // …
    ((void) 0);
}

…換句話說,只包含了header.h中對應於#ifdef NDEBUG的部分,而不是#else子句中的部分。 如果我們在沒有定義NDEBUG的情況下包含header.h ,那么包含的 header 代碼將包含log_message的定義。

正如其他人所說, #include將逐字粘貼您要定位的整個文件 但是,您通常會包含標頭,這些標頭看起來像

extern int a (int b);

extern char * c (void);

static inline int d (int e, int f) {
    ...
}

extern void * g (void * h);

...

上面的代碼恰好占用零 memory(除非您開始使用其中一個inline函數),因為它完全由編譯器指令組成,沒有其他任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM