对象式宏 object-like macro

代码清单 5-10

define a b

如: #define NUMBER 5 /宏名一般用大写字母表示/

/* 输入5名学生的分数并显示出她们的总分和平均分(用宏定义人数) */
#include <stdio.h>
#define NUMBER 5   /* 学生人数*/

int main(void)
{
  int i;
  int fenshu[NUMBER];    /*NUMBE个学生人数*/
  int sum=0;

  printf("请输入%d学生的分数:\n",NUMBER);

  for (i=0;i<NUMBER;i++)
  {
      printf("%2d号:",i+1);
      scanf("%d",&fenshu[i]);
      sum+=fenshu[i];
  }

  printf("总分:%5d\n",sum);
  printf("平均分:%5.1f\n",(double)sum/NUMBER);
  return 0;
}
### 函数式(Function-Like Macro)的概念 函数式是一种预处理指令,在 C 和 C++ 中通过 `#define` 定义。它类似于函数调用,但在编译之前由预处理器展开并替换为指定的内容[^1]。 定义形式如下: ```c #define MACRO_NAME(param1, param2, ...) replacement_text ``` 其中: - `MACRO_NAME` 是的名字。 - `(param1, param2, ...)` 表示参数列表,可以为空。 - `replacement_text` 是实际被替换的代码片段。 当遇到形如 `MACRO_NAME(arg1, arg2, ...)` 的表达式时,预处理器会将其替换为 `replacement_text` 并执行相应的参数替换操作。 --- ### 使用实例 #### 基本用法 下面是一个简单的例子,展示如何使用带参数的来计算两个数的最大值: ```c #define MAX(a, b) ((a) > (b) ? (a) : (b)) int main() { int x = 5; int y = 10; int max_value = MAX(x, y); return 0; } ``` 在这个例子中,`MAX(5, 10)` 被替换为 `((5) > (10) ? (5) : (10))`,从而实现最大值的选择功能。 #### 可变参数 自 C99 和 C++11 开始支持可变参数,允许传递任意数量的参数给。以下是其基本语法: ```c #define LOG(format, ...) printf(format, __VA_ARGS__) ``` 这里,`__VA_ARGS__` 是一个特殊标记符,表示所有额外传入的参数集合。例如: ```c LOG("Error: %s\n", strerror(errno)); // 展开为:printf("Error: %s\n", strerror(errno)); ``` 需要注意的是,C++ 对于某些高级特性有更严格的限制,比如不允许在特定上下文中使用 `__VA_OPT__`。 #### 结合类型推导 如果希望结合现代 C++ 特性,可以通过 `decltype` 推导返回类型的复杂表达式。例如: ```cpp #define TYPEOF(expr) decltype(expr) template<typename T> T add(T a, T b) { typename TYPEOF(a * b) result = a + b; // 类型自动推导 return result; } void test() { double d = add(3.5, 4.7); // 自动推导为 double } ``` 上述代码利用了 `decltype` 来获取表达式的具体类型,并动态调整模板中的变量声明[^2]。 --- ### 注意事项 尽管函数式非常灵活,但也存在一些潜在问题: - **缺乏类型检查**:不会验证输入参数的合法性,可能导致意外行为。 - **重复求值风险**:由于每次调用都会完全展开,可能会多次评估相同的表达式,造成性能损失或逻辑错误。 因此,在可能的情况下应优先考虑使用内联函数或其他机制替代传统定义[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值