宏没有用C定义(Macro without definition in C)

2019-08-17 08:49发布

什么是宏功能的定义不使用/适用性:

#ifndef __SYSCALL
#define __SYSCALL(a, b)
#endif

人们可以找到这个宏在Linux系统中头文件/usr/include/asm/msr.h

我还注意到以下类型的宏。

#define _M(x) x

而唯一原因定义这种宏,我能想到的,以使代码一致的。 像中的#define某物(1 << 0) 。 是否有任何其他隐藏的(更好的)使用这种宏的?

与示例的答案将是非常有益的。 也有人可以给我提供一个文本/链接阅读关于这一点。

Answer 1:

一个这种形式的宏的最常见的情况的:

#define _M(x) x

是提供向后兼容性的编译器为仅支持C的原始K&R方言,也早于现在无处不在ANSI C方言。 在语言的原始K&R方言,宣告功能时未指定函数参数。 在1989年,ANSI标准化语言和并入了许多改进,包括声明类型的参数的数目的函数原型。

int f(int x, double y); /* ANSI C. K&R compilers would not accept this */

int f(); /* Function declared in the original K&R dialect */

同时支持C的原K&R方言的编译器是罕见的(或已灭绝)这几天,很多软件的编写时要支持这两种需要编译器,和宏提供了一个简单的方法来支持。 还有很多头铺设约提供这种向后兼容的。

用于K&R编译器提供向后兼容性,许多头文件有以下:

#if ANSI_PROTOTYPES
#  define _P(x) x
#else
#  define _P(x) ()
#endif

...

int f _P((int x, double y));

如果ANSI_PROTOTYPES定义已正确设置(由用户或由某些现有#ifdef逻辑),那么你得到所需的行为:

  • 如果ANSI_PROTOTYPES被定义,该定义扩展为int f(int x, double y)
  • 如果没有定义ANSI_PROTOTYPES,定义扩展为int f()


Answer 2:

这通常与条件表达式使用使其进行预处理,以什么来禁用宏。 例如(简化):

#ifdef DEBUG
#define ASSERT(x) if(!(x)) { abort(); }
#else
#define ASSERT(x) /* nothing */
#endif


Answer 3:

只是跟进我的问题。

我得到了很好的答案。 但我也加入了一些更多的帮助例子,其中没有定义宏是有用的,可以发现它在未来有所帮助:

(1): 为什么我看到扔在一个C库?
使用共享C和C ++之间的头文件。 宏名称是_THROW(x)

#ifdef __cplusplus
    #define __THROW(x) throw(x)
#else
    #define __THROW(x)
#endif  

(2) 以消除警告当未使用的功能参数:
这种用途是用于C ++。 在C语言中它会导致错误的参数太少 ,但在C ++中它没有错误的原理 :( 键盘连接

#define UNUSED(x)
int value = 0;
int foo(int UNUSED(value))
{
    return 42;
}
int main(){
   foo(value);
}

为了这个,我在我的问题中新增的C ++代码

另外,
(3):使用#define _M(x) x是如下,只是为了使代码排队均匀:

/* Signed.  */
 # define INT8_C(c)      c
 # define INT16_C(c)     c
 # define INT32_C(c)     c
 # if __WORDSIZE == 64
 #  define INT64_C(c)    c ## L
 # else
 #  define INT64_C(c)    c ## LL
 # endif

该文件是: /usr/include/stdint.h



Answer 4:

这意味着,使用该宏将有条件进行预处理烂掉的代码。

作为简单的例子,考虑调试代码,记录或断言。



Answer 5:

这可能是一个调试宏或平台的宏。 例如可以说我有连接到INT3调试器。 当我调试,我可能有这样的

 #define debug() INT3()

然后,为了安全起见,我会这增加了生产代码(以确保我把他们全都出来)

 #define debug()

这看起来像类似的东西

这可能是因为在一些系统的情况下,这种代码需要拨打电话 - 例如在某个CPU体系结构或操作系统。 但是,您的系统上它只是没有制作的通讯资料。



文章来源: Macro without definition in C