gpt4 book ai didi

macros - C 中没有定义的宏

转载 作者:行者123 更新时间:2023-12-02 03:18:14 25 4
gpt4 key购买 nike

没有定义的宏函数的用途/适用性是什么:

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

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

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

#define _M(x) x

我认为定义这种宏的唯一原因是为了使代码统一。就像 #define SOMETHING (1 << 0) 。这种宏还有其他隐藏的(更好的)用途吗?

带有示例的答案将非常有帮助。还有人可以给我提供一个文本/链接来阅读此内容吗?

最佳答案

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

#define _M(x) x

是为仅支持原始 K&R C 方言(早于现在普遍存在的 ANSI C 方言)的编译器提供向后兼容性。在该语言的原始 K&R 方言中,声明函数时未指定函数参数。 1989 年,ANSI 对该语言进行了标准化,并进行了许多改进,包括声明参数类型数量的函数原型(prototype)。

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 方言的编译器很少(或已经绝迹),但在需要支持这两种编译器时编写了大量软件,而宏提供了一种支持这两种编译器的简单方法。仍然有很多 header 提供这种向后兼容性。

为了向 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()

关于macros - C 中没有定义的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15256090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com