什么是宏功能的定义不使用/适用性:
#ifndef __SYSCALL
#define __SYSCALL(a, b)
#endif
人们可以找到这个宏在Linux系统中头文件/usr/include/asm/msr.h
我还注意到以下类型的宏。
#define _M(x) x
而唯一原因定义这种宏,我能想到的,以使代码一致的。 像中的#define某物(1 << 0) 。 是否有任何其他隐藏的(更好的)使用这种宏的?
与示例的答案将是非常有益的。 也有人可以给我提供一个文本/链接阅读关于这一点。
一个这种形式的宏的最常见的情况的:
#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()
这通常与条件表达式使用使其进行预处理,以什么来禁用宏。 例如(简化):
#ifdef DEBUG
#define ASSERT(x) if(!(x)) { abort(); }
#else
#define ASSERT(x) /* nothing */
#endif
只是跟进我的问题。
我得到了很好的答案。 但我也加入了一些更多的帮助例子,其中没有定义宏是有用的,可以发现它在未来有所帮助:
(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
这可能是一个调试宏或平台的宏。 例如可以说我有连接到INT3调试器。 当我调试,我可能有这样的
#define debug() INT3()
然后,为了安全起见,我会这增加了生产代码(以确保我把他们全都出来)
#define debug()
这看起来像类似的东西
这可能是因为在一些系统的情况下,这种代码需要拨打电话 - 例如在某个CPU体系结构或操作系统。 但是,您的系统上它只是没有制作的通讯资料。