[英]Preprocessor macro without replacement C++
根據cplusplus.com,定義宏的語法是:
#define identifier replacement
但是,我有時會偶然發現一個不包含替換的宏定義。 例如,在afxwin.h中,有以下預處理器定義:
#define afx_msg // intentional placeholder
我的問題:
afx_msg void OnAddButton();
是否為afx_msg void OnAddButton();
變為void OnAddButton();
? “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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.