在 main() 之外处理 argc 和 argv

2023-11-23

如果我想将用于处理命令行参数的大部分代码保留在 main 之外(以便组织和更具可读性的代码),那么最好的方法是什么?

void main(int argc, char* argv[]){
    //lots of code here I would like to move elsewhere
}

要么将它们作为参数传递,要么将它们存储在全局变量中。只要您不从 main 返回并尝试在atexit全局范围内对象的处理程序或析构函数,它们仍然存在并且可以从任何范围访问。

例如:

// Passing them as args:
void process_command_line(int argc, char **argv)
{
    // Use argc and argv
    ...
}

int main(int argc, char **argv)
{
    process_command_line(argc, argv);
    ...
}

或者:

// Global variables
int g_argc;
char **g_argv;

void process_command_line()
{
    // Use g_argc and g_argv
    ...
}

int main(int argc, char **argv)
{
    g_argc = argc;
    g_argv = argv;
    process_command_line();
    ...
}

将它们作为参数传递是一个更好的设计,因为它是封装的,如果您想要或轻松地将程序转换为库,您可以修改/替换参数。全局变量更容易,因为如果您有许多不同的函数出于某种原因访问参数,您只需将它们存储一次,而无需在所有不同的函数之间不断传递它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 main() 之外处理 argc 和 argv 的相关文章

随机推荐

  • 在Java中使用类来存储静态数据?

    创建一个单独的类并将其用作仅包含静态数据变量的存储是一个坏主意吗 我目前正在开发一个 Android 应用程序 但这个问题对于 Java 来说是普遍的 对于android 我正在跨活动移动 我想在该单独的类中存储一些全局 静态标志 变量 并
  • iOS Widget后台更新

    根据苹果关于 widgetPerformUpdateWithCompletionHandler 的说法 当小部件不可见时 iOs Widget 也可以更新其内容 在我的调试会话中 我注意到每次通知中心视图消失时 dayViewControl
  • 导入Android平台类的问题

    我是安卓新手 似乎有太多的问题只是让 Eclipse 和 SDK 设置一切都在它应该在的地方 我一直在研究 Android 开发者网站上的一个示例 但它抛出一个错误 导入android support无法解决 我正在尝试导入以下内容 imp
  • HTML 选择“完成”标签未显示在 iOS 版 Ionic 上

    我正在使用 Ionic 框架构建一个 iOS 应用程序 当我使用 select elements 时 在 iOS 原生的菜单中选择项目时 我没有获得带有 完成 标签的标题 然而 当我在 iOS Safari 中使用该应用程序时 它会出现 附
  • 自动绘制不同颜色的线条

    我试图在同一张图上绘制几个核密度估计 并且我希望它们都是不同的颜色 我有一个使用字符串的拼凑解决方案 rgbcmyk 并针对每个单独的图逐步执行它 但在 7 次迭代后我开始出现重复 有没有更简单 更有效的方法来做到这一点 并且有更多的颜色选
  • SQL 错误:“无法在用户实例中使用全文搜索。”

    作为构建过程的一部分 我使用 SSEUtil 根据源自我的开发数据库 SQL Server 2008 R2 的架构自动创建功能测试数据库 这使我能够保持两个数据库同步 模式方面 而无需针对我的开发数据库运行 SQL 存储库测试 我最近在我的
  • 圆形左侧 CSS [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我目前正在尝试使用 CSS 实现以下效果 不幸的是 我的努力未能尝试修改代码以使其稍微正确 任何帮助将不胜感激 您可以使用border radius仅在两个左角上并分别组合两个值 如本例所
  • 使用 MessageCard 通过 MS Teams 中的传入 Webhook @mention

    我在 Cherwell 中有一个步骤 它根据条件触发 Web 服务并将 MessageCard 发送到 MS Teams 中的通道 当消息到达频道时 我找不到触发 提及的方法 在当前的 WFH 中 所有技术人员都在 Teams 中 并且没有
  • github/git Checkout 在 Windows 上返回“错误:无效路径”

    当我尝试从 github 签出存储库时 出现错误 error invalid path configs perl modules DIST 64 perl HTML Tree 1 5 03 1 el6 noarch rpm 我怀疑问题是路径
  • 有没有办法使用 Kotlin 的暴露库运行原始 sql

    我正在尝试运行一些特定于 postgres 的 sql 并希望重用 Exposed 中的事务管理 暴露的有Transaction exec String 方法可能会做你想要的 看https github com JetBrains Expo
  • 模态对话框不关闭键盘

    我遇到了一个问题 即离开时键盘不会消失UITextField or UITextView in a UIModalPresentationFormSheet 此外 我创建了一个大按钮作为视图的背景 因此如果用户点击字段外部 它就会被触发 我
  • C++ 枚举是有符号的还是无符号的?

    C 枚举是有符号的还是无符号的 通过扩展 通过检查输入是否 您的最小值 假设您从 0 开始并增加 1 来验证输入是否安全 让我们追根溯源 以下是 C 03 标准 ISO IEC 14882 2003 文档 7 2 5 枚举声明 中的内容 枚
  • Android:在没有 Activity 或 Context 引用的情况下访问资源

    我发布这个问题是希望能得到某种明确的答案 如果没有活动或上下文引用 真的不可能访问资源吗 当所需的只是访问一些与 UI 无关的值 资产或字符串时 传递此类引用会导致代码过于复杂 加上所有那些潜在的悬挂参考 这也完全破坏了各种设计模式 例如单
  • 对于 i = 0,为什么 (i += i++) 等于 0?

    获取以下代码 可用作控制台应用程序 static void Main string args int i 0 i i Console WriteLine i Console ReadLine 的结果i是 0 我预计是 2 正如我的一些同事所
  • “异常:t 实例化期间出错!主插座已注册。”在科尔多瓦 Angular2 应用程序中

    我正在用我的项目构建一个简单的科尔多瓦应用程序 它有 2 层嵌套 主路由 gt 子路由 gt 另一个子路由 When trying to browse to the 2nd level another child route 我收到一条错误
  • Chrome 中检测浏览器打印事件有两种不同的方式

    我目前使用的是最新版本的 Chrome 43 0 2357 130 并且在从以下位置调用 print 时遇到打印功能的差异window print 与使用 P 相比 打印时使用window print 它正确输出到控制台 它输出Before
  • WPF FlowDocument - 绝对字符位置

    我有一个 WPF RichTextBox 我正在其中输入一些文本 然后解析整个文本以进行处理 在此解析过程中 我获得了每个单词的开头和结尾的绝对字符位置 我想使用这些字符位置对某些单词应用格式 但是 我发现 FlowDocument 使用
  • 将 Dictionary 转换为匿名对象?

    首先 为了让事情更清楚 我将从顶部解释我的场景 我有一个具有以下签名的方法 public virtual void SendEmail String from List
  • 如何删除包含 GridView 的空 div

    在 ASP NET Gridviews 中生成一个表 该表生成一个父 div 容器 这可能会破坏 CSS 布局 因为无法将样式附加到生成的 div 有没有办法阻止 div 生成或对其应用样式 已询问此问题并标记为已解决here但MS只是说d
  • 在 main() 之外处理 argc 和 argv

    如果我想将用于处理命令行参数的大部分代码保留在 main 之外 以便组织和更具可读性的代码 那么最好的方法是什么 void main int argc char argv lots of code here I would like to