【发布时间】:2019-10-02 13:55:17
【问题描述】:
在 C11/gnuC11 中,如果宏参数是或不是类型名称,或者至少一个宏可以区分整数常量表达式和typenames(即,如果可以检测到参数不是其中之一,则可以假定它是另一个)?
#define IS_TYPENAME(X) /*???*/
_Static_assert( IS_TYPENAME(int), "" );
_Static_assert( !IS_TYPENAME(42), "" );
动机:
我的动机是用一个宏包装_Alignas,如果建议的对齐方式(类型或整数表达式)小于当前对齐方式(正常的_Alignas,使用较小的对齐方式会导致错误),该宏将什么也不做) 所以我也想接受类型名或整数 expr,但现在我想只需要一个整数 expr(你总是可以通过应用 _Alignof 从类型名中获取)将是更简单/更清晰的方法走。
【问题讨论】:
-
像往常一样,我对您为什么需要这样做很感兴趣?您需要解决的真正根本问题是什么?为什么你认为这是该问题的自然解决方案?你确定没有其他方法可以解决这个问题吗?
-
我不认为这是可能的,因为宏正在预处理,而类型名仅在编译期间才知道。
-
你可以使用
_Generic,但它并不漂亮。 -
@Bathsheba - 给定
typedef int myInt;_generic如何帮助确定myInt是否是编译前的类型名称? -
如果您在编译器需要类型但它不是类型的上下文中使用标识符。编译器将诊断错误。这就是它的工作(除其他外)。由于您对假设宏所做的一切都是
_Static_Assert,因此您并没有实现任何不同。所以这让我觉得毫无意义——即使它是可能的,但它似乎不是。