![](/img/trans.png)
[英]According to the C standard, may macros with arguments collide with identifiers?
[英]C Standard Conformance - Identifiers
我正在尋找一些有關C標准(C99和/或C11)的說明,主要是關於標識符的使用。
上下文是完整C99標准庫的實現,我希望它完全符合該標准。
基本問題是: C標准允許我在多大程度上聲明未在標准中列出的標識符/符號?
例如,讓我們考慮math.h
的isfinite
宏。
可能的實現方式可能是:
#define isinf( _x_ ) \
( \
( sizeof( _x_ ) == sizeof( float ) ) ? _c99_math_isinf_f( _x_ ) : \
( sizeof( _x_ ) == sizeof( double ) ) ? _c99_math_isinf_d( _x_ ) : \
_c99_math_isinf_l( _x_ ) \
)
int _c99_math_isinf_f( float x );
int _c99_math_isinf_d( double x );
int _c99_math_isinf_l( long double x );
在這里,我需要聲明顯然不屬於 C標准的其他標識符 。
在C99標准( 一致性 ) 第4部分的注釋3中,我們可以閱讀:
這意味着除本國際標准中明確保留的標識符外,符合標准的實現不保留任何標識符。
我不確定是否了解。
這是否意味着我不允許聲明其他標識符?
假設情況並非如此,並且允許我為自己的實現聲明其他標識符,那么我應該遵循什么命名規則 ,考慮到這些標識符除了上面的示例中的宏擴展之外,不打算使用?
在C99標准的7.1.3節 ( 預留標識符 )中,我們可以閱讀:
- 以下划線,大寫字母或另一個下划線開頭的所有標識符始終保留供任何使用。
- 始終保留所有以下划線開頭的標識符,以用作普通名稱和標記名稱中具有文件范圍的標識符。
好的,我不會聲明帶有雙引號和雙引號的標識符,也不能帶單引號和大寫字母。
但是第二條規則又如何考慮我上面的示例呢?
保留標識符規則的重點是為實施保留了這些標識符。 現在,您正在編寫實現的一部分(而不是“最終用戶程序”),您應該在保留的名稱空間中命名標識符,以確保標識符不會意外地與(最終)端的標識符發生沖突。用戶。
作為運行中該規則的示例,如果您使用的是Linux,請使用“ readelf -s”檢查glibc或libgcc的符號列表。 您會發現大量帶有雙下划線的符號,或帶下划線的大寫字母。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.