換句話說,如何根據之前的定義重新定義宏?具體來說,我想在 C 中的字串宏的末尾添加一個字串。這是我迄今為止嘗試過的:
#define FOO "bla"
// code here will read FOO as "bla"
#define FOO FOO ## "dder"
// code here will read FOO as "bladder"
在 C 中,這將回傳error: FOO was not declared in this scope. 我將如何做到這一點而不會出現此錯誤?
編輯:我已閱讀評論并發現“XY 問題”是什么。我想做的是為 C 創建一個庫,但該庫是用 C 撰寫的。因為該庫需要類才能運行(因為它使用其他 C 庫),所以我想創建一個空類,使用該庫的 C 程式可以添加自定義屬性來使用宏函式。像這樣的東西:
// lib.h
#define PROPERTIES ""
#define NEW_PROPERTY(X) // add X ";\n" to PROPERTIES (somehow)
#ifdef __cplusplus
Class myclass
{
public:
PROPERTIES
}
#endif
_
// c code
#include <lib.h>
NEW_PROPERTY(int id);
NEW_PROPERTY(int color);
int main(){
...
c 程式不需要訪問這些屬性,因為它們只存在于我的庫依賴的第三方庫可以使用它們。
uj5u.com熱心網友回復:
這是不可能的。
從gcc 檔案(重點是我的):
但是,如果重新定義當前是宏的識別符號,則新定義必須與舊定義有效地相同。如果滿足以下條件,兩個宏定義實際上是相同的:
- 兩者都是相同型別的宏(類物件或類函式)。
- 替換串列的所有標記都是相同的。
- 如果有任何引數,它們是相同的。
- 空白出現在兩者的相同位置。不過,它不必是完全相同數量的空格。請記住,注釋算作空白。
這些定義實際上是相同的:
#define FOUR (2 2) #define FOUR (2 2) #define FOUR (2 /* two */ 2)但這些不是:
#define FOUR (2 2) #define FOUR ( 2 2 ) #define FOUR (2 * 2) #define FOUR(score,and,seven,years,ago) (2 2)如果使用與舊定義不同的定義重新定義宏,則前處理器會發出警告并更改宏以使用新定義。如果新定義實際上相同,則重新定義將被忽略。例如,這允許兩個不同的標頭定義一個公共宏。如果定義不匹配,前處理器只會抱怨。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473158.html
上一篇:使用esp_now發送資料
