簡體   English   中英

預處理器宏沒有替換C ++

[英]Preprocessor macro without replacement C++

根據cplusplus.com,定義宏的語法是:

#define identifier replacement

但是,我有時會偶然發現一個不包含替換的宏定義。 例如,在afxwin.h中,有以下預處理器定義:

#define afx_msg         // intentional placeholder

我的問題:

  1. 當使用沒有替換的預處理器定義時,在編譯時會發生什么? 它被忽略了嗎? 例如,行afx_msg void OnAddButton();是否為afx_msg void OnAddButton(); 變為void OnAddButton();
  2. 在沒有替換的情況下使用預處理器的目的是什么? 是否只是為了使代碼更清晰?

“Nothing”(無文本)是宏的有效替換文本。 它將被預處理器簡單地刪除(更確切地說,由任何東西替換)。

你使用這樣的東西有很多原因。 一種是簡單地在#ifdef和類似的構造函數中使用宏。

另一種是條件編譯。 典型的用例是公共API和DLL導出。 在Windows上,您需要將函數標記為從DLL(構建DLL時)或從DLL導入時(在鏈接DLL時)導出的函數。 在ELF系統上,不需要這樣的聲明。 因此,您經常會在公共庫頭文件中看到這樣的代碼:

#ifdef _WIN32
  #ifdef BUILDING_MYLIB
     #define MYLIB_API __declspec(dllexport)
  #else
     #define MYLIB_API __declspec(dllimport)
  #endif
#else
  #define MYLIB_API
#endif

void MYLIB_API myApiFunction();

另一個原因可能是代碼處理工具。 也許你有一個解析源代碼的工具,用一個標記提取一個函數列表。 您可以將此標記定義為空宏。

#define bla

簡單地定義bla

你可以用它

#ifdef bla
...
place some code here
...
#endif

一個典型的用例是#define DEBUG用於在調試模式下啟用特殊代碼部分。

從“外部”設置此類事物的另一種方法是:

 g++ -DDEBUG x.cpp

這也設置了定義的宏DEBUG。

每個頭文件應該有類似的東西:

#ifndef THIS_HEADER_INCLUDE_GUARD
#define THIS_HEADER_INCLUDE_GUARD
...
rest of header file
...
#endif

這只是保護你的頭文件(recursivly)讀取更多一次。

有些可以通過特定於實現的#pragma once

  1. 預處理器處理它,刪除它並替換它什么都沒有
  2. 可能有多種原因,包括可讀性,可移植性,自定義編譯器功能等。

暫無
暫無

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

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