簡體   English   中英

C預處理程序:__ COUNTER__的自己的實現

[英]C Preprocessor: Own implementation for __COUNTER__

我當前在C庫代碼中使用__COUNTER__宏來生成唯一的整數標識符。 效果很好,但是我看到兩個問題:

  • 它不是任何C或C ++標准的一部分。
  • 也使用__COUNTER__獨立代碼可能會造成混淆。

因此,我希望自己實現與__COUNTER__等效的__COUNTER__

我知道但希望使用的替代方法:

  • __LINE__ (因為每行多個宏不會獲得唯一的ID)
  • BOOST_PP_COUNTER (因為我不想boost依賴)

BOOST_PP_COUNTER證明可以做到這一點,即使其他答案認為這是不可能的。

本質上,我正在尋找頭文件“ mycounter.h”,這樣

#include "mycounter.h"

__MYCOUNTER__
__MYCOUNTER__ __MYCOUNTER__
__MYCOUNTER__

將由gcc -E預處理為

(...)

0
1 2
3

而不使用內置的__COUNTER__

注意:之前,此問題被標記為this的重復,它使用__COUNTER__而不是避免使用。

您不能直接實現__COUNTER__ 預處理器純粹是功能性的-狀態不變。 在這種系統中,隱藏計數器本質上是不可能的。 BOOST_PP_COUNTER 不能證明您要完成的工作-它依賴於#include ,因此僅一行執行-最好使用__LINE__ 。也就是說,實現非常出色,無論如何都應該閱讀它。)

您可以做的是重構您的元程序,以便可以通過純函數將計數器應用於輸入數據。 例如,使用良好的命令

#include <order/interpreter.h>

#define ORDER_PP_DEF_8map_count  \
ORDER_PP_FN(8fn(8L, 8rec_mc(8L, 8nil, 0)))

#define ORDER_PP_DEF_8rec_mc     \
ORDER_PP_FN(8fn(8L, 8R, 8C,      \
                8if(8is_nil(8L), \
                    8R,          \
                    8let((8H, 8seq_head(8L))  \
                         (8T, 8seq_tail(8L))  \
                         (8D, 8plus(8C, 1)),  \
                          8if(8is_seq(8H),    \
                              8rec_mc(8T, 8seq_append(8R, 8seq_take(1, 8L)), 8C),  \
                              8rec_mc(8T, 8seq_append(8R, 8seq(8C)), 8D) )))))

ORDER_PP (
  8map_count(8seq( 8seq(8(A)), 8true, 8seq(8(C)), 8true, 8true ))  //((A))(0)((C))(1)(2)
)

(沿列表遞歸,將子列表元素留在原處,並用遞增計數器變量替換非列表元素(由8false表示))

我假設您實際上並不想簡單地在程序頂層刪除__COUNTER__值,因此如果您可以將需要編織__COUNTER__值的代碼放入包裝宏中,該宏會將其拆分為某種序列或列表,則可以然后將列表提供給與示例類似的純函數。

當然,與__COUNTER__相比,能夠表達這種代碼的元編程庫的可移植性和可維護性將大大降低。 __COUNTER__受Intel,GCC,Clang和MSVC支持。 (不是所有人,例如pcc都沒有,但是有人甚至使用它嗎?)可以說,如果您在實際代碼中演示了正在使用的功能,則對於標准化委員會來說, __COUNTER__ 應該成為下一個C的一部分更有力。標准。

您在混淆兩件事:

1-處理#define#include類的預處理器。 它僅在文本(含義是字符序列)級別上起作用,並且具有很少的計算能力。 它是如此有限,以致於無法實現__COUNTER__ 預處理程序僅包括宏擴展和文件替換。 至關重要的一點是,它甚至在編譯開始之前就已發生。

2-C ++語言,尤其是模板(元)編程語言,可用於在編譯階段計算內容。 它確實已經完成,但是正如我已經說過的,編譯是在預處理之后開始的。

因此,您要問的是在標准C或C ++中不可行。 為了解決這個問題, boost實現了自己的不符合標准且具有更多計算能力的預處理器。 特別地,可以使用__counter__建立__counter__的類似物。

我的這個小標頭包含一個自己的C預處理程序計數器實現(它使用略有不同的語法)。

暫無
暫無

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

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