当前位置: 首页 > wzjs >正文

专门做字体设计的网站滁州seo网站推广方案

专门做字体设计的网站,滁州seo网站推广方案,达州注册公司,网上做娱乐广告的网站文章目录 一、C 风格可变参数函数二、std::initializer_list三、C11 可变参数模板(Variadic Templates)四、注意事项五、可变参数宏 C主要有三类方法实现可变参数 一、C 风格可变参数函数 (兼容 C,但类型不安全,需谨…

文章目录

    • 一、C 风格可变参数函数
    • 二、std::initializer_list
    • 三、C++11 可变参数模板(Variadic Templates)
    • 四、注意事项
    • 五、可变参数宏

C++主要有三类方法实现可变参数

一、C 风格可变参数函数

(兼容 C,但类型不安全,需谨慎使用)
语法:使用 ...va_list 系列宏。
适用场景:与 C 代码交互,或需要兼容旧代码。
示例

#include <cstdarg>
void print_ints(int count, ...) {va_list args;va_start(args, count);for (int i = 0; i < count; ++i) {int val = va_arg(args, int);std::cout << val << " ";}va_end(args);
}
// 调用:print_ints(3, 1, 2, 3);

缺点

  • 无类型安全检查,错误参数会导致未定义行为。
  • 必须手动指定参数数量和类型(如第一个参数 count)。

二、std::initializer_list

(参数类型相同,数量可变)
适用场景:初始化同类型对象的集合(如容器构造)。
示例

void sum(std::initializer_list<int> nums) {int total = 0;for (auto n : nums) total += n;std::cout << total;
}
// 调用:sum({1, 2, 3, 4});

限制

  • 所有参数必须为同一类型。
  • 参数列表不可直接修改(只读视图)。

三、C++11 可变参数模板(Variadic Templates)

(类型安全,现代 C++ 推荐方式)
核心机制

  • 模板参数包template<typename... Args>
  • 函数参数包void func(Args... args)
  • 展开操作:递归、折叠表达式(C++17)等。
  1. 基本用法
template<typename... Args>
void log(Args... args) {(std::cout << ... << args) << "\n"; // C++17 折叠表达式
}
// 调用:log("Value:", 42, "Flag:", true);
  1. 递归展开参数包
// 递归终止条件
void process_args() {}template<typename T, typename... Args>
void process_args(T first, Args... rest) {std::cout << first << "\n";process_args(rest...); // 递归展开剩余参数
}
// 调用:process_args(1, "hello", 3.14);
  1. 完美转发
template<typename... Args>
void wrapper(Args&&... args) {target_func(std::forward<Args>(args)...); // 完美转发参数包
}

优点

  • 类型安全,支持任意类型和数量的参数。
  • 灵活扩展,适用于泛型编程和元编程。

四、注意事项

  1. C 风格可变参数
    • 避免混用不同类型(如 intdouble 可能引发对齐错误)。
    • 必须通过额外参数(如 format 字符串)明确参数类型。
  2. 可变参数模板
    • 可能导致代码膨胀(每个不同参数类型组合生成新模板实例)。
    • 递归深度过大可能触发编译器限制(可通过尾递归优化或折叠表达式缓解)。
  3. std::initializer_list
    • 参数为右值,不可直接传递非临时对象。
    • 不支持异构类型参数。

五、可变参数宏

可变参数宏 __VA_ARGS__ 是 C 语言预处理器中的一个特性,允许宏接受可变数量的参数。其核心作用是将宏定义中的可变参数展开为实际传入的参数列表

  1. 基本用法
    在宏定义中,使用 ... 表示可变参数,并通过 __VA_ARGS__ 引用这些参数。例如:

    #define LOG(...) printf(__VA_ARGS__)
    

    调用 LOG("Value: %d", 42); 会被展开为:

    printf("Value: %d", 42);
    

    __VA_ARGS__ 直接替换为宏调用时传入的可变参数。

  2. 适用场景
    可变参数宏常用于日志输出、调试代码或封装可变参数函数(如 printf),提供灵活的接口。

当在 __VA_ARGS__ 前添加 ## 时,其核心作用是处理可变参数为空的情况,避免语法错误。具体行为如下:

  1. 语法修正:去除多余的逗号
    假设定义宏:

    #define LOG(fmt, ...) printf(fmt, ##__VA_ARGS__)
    
    • 当可变参数非空(如 LOG("%d", 42);):
      展开为 printf("%d", 42);## 无额外作用。
    • 当可变参数为空(如 LOG("Hello");):
      展开为 printf("Hello");## 会“吞掉” fmt 后的逗号,避免出现 printf("Hello", ); 这样的语法错误。
  2. 兼容性与标准

    • GNU 扩展特性## 的此用法是 GNU CPP(GNU 编译器预处理器)的扩展,被 GCC 和 Clang 等编译器支持。

    • C99/C11 标准:C 标准不要求支持此行为,但部分编译器(如 MSVC)也实现了类似功能。

    • C11 的替代方案:C11 引入了 __VA_OPT__,可更标准地处理空参数:

      #define LOG(fmt, ...) printf(fmt __VA_OPT__(,) __VA_ARGS__)
      
  3. 示例对比

    • ## 的情况

      #define BAD_MACRO(fmt, ...) printf(fmt, __VA_ARGS__)
      BAD_MACRO("Error!"); // 展开为 printf("Error!", ); → 编译错误!
      
    • ## 的情况

      #define GOOD_MACRO(fmt, ...) printf(fmt, ##__VA_ARGS__)
      GOOD_MACRO("OK"); // 展开为 printf("OK"); → 正确
      

使用建议

  • 若需兼容性优先,使用 ## + __VA_ARGS__(注意编译器支持)。
  • 若使用支持 C11 的编译器,优先选择 __VA_OPT__

参考:DeepSeek


文章转载自:

http://EwHZR93I.tqqfj.cn
http://Pln1FLDB.tqqfj.cn
http://Au1qKmYC.tqqfj.cn
http://FKkIEa13.tqqfj.cn
http://ubaemtjm.tqqfj.cn
http://2I209Z7k.tqqfj.cn
http://x3vA81QV.tqqfj.cn
http://gVLzCRxV.tqqfj.cn
http://fWVlvjWB.tqqfj.cn
http://jvhlJPtf.tqqfj.cn
http://RE84Vwb6.tqqfj.cn
http://gZGB7FrQ.tqqfj.cn
http://7IuYfYzw.tqqfj.cn
http://ghl0ehJM.tqqfj.cn
http://Zpi4BedH.tqqfj.cn
http://XNyfl4wa.tqqfj.cn
http://s1klphRC.tqqfj.cn
http://s3IDQXIe.tqqfj.cn
http://wcnlIXsz.tqqfj.cn
http://zXFNLd8U.tqqfj.cn
http://dBYYJHfV.tqqfj.cn
http://itoFjxDT.tqqfj.cn
http://MEomNKBr.tqqfj.cn
http://Ob82Jdyq.tqqfj.cn
http://GAR0XOEX.tqqfj.cn
http://2MzNMU7t.tqqfj.cn
http://DEwVMiT9.tqqfj.cn
http://I38Bndwv.tqqfj.cn
http://c0vpYlyT.tqqfj.cn
http://A39WLcuj.tqqfj.cn
http://www.dtcms.com/wzjs/759291.html

相关文章:

  • 宣讲网站建设关于校园网站建设的通知
  • 企业网站模板 优帮云wordpress邮件发不出
  • 建设校园门户网站方案wordpress宝塔开启ssl
  • 西宁设计网站建设户外媒体网站建设免费
  • 百度推广网站谁做什么网站赚的钱最多
  • 宁德网站建设51yunsou公众号运营策划方案模板
  • 电子商务网站的基础建设怎么新建网站
  • 南宁网站建设方案书关于网站建设的策划案
  • 体育网站建设规划宜兴网站优化
  • 网站系统返利网站开发代码
  • 网站的定位姓名查询
  • 外贸接单十大网站建筑工程公司经营范围
  • 廊坊网站建设方案开发做数据收集网站
  • 网站建设达到什么水平梦里做他千百度网站
  • 长沙网站设计域名备案和网站备案有什么区别
  • 保定模板建站平台潍坊高端网站建设价格
  • 手机网站模板免费下载wordpress 4 drupal 8
  • 5188站长平台万网域名续费查询
  • 广州网站建设商家如何免费创建一个个人网站
  • 芜湖十大企业排名网站推广优化方式
  • 甘肃网站建设哪家便宜wordpress级简主题
  • 网站内容更新用什么wordpress自定义字段判断
  • 网站建设主要课程wordpress树形目录
  • 营销软文的范文郑州企业网站快速优化价格
  • ps做好切片后怎么做网站阿里巴巴官网卖家版
  • 重庆建设网站的公司简介目前引流最好的app
  • 电子商务网站建设实训展示昆明网站排名优化价格
  • 北京建设工程协会网站做营销策划要用到哪些网站
  • word网站流程图怎么做宣传类的网站有哪些内容
  • app网站模板下载网页设计师证书报名官网