(int agrc,const char* const* argv)为参数的函数

本文深入解析了C++编程中argv参数的用法,详细解释了其作为二级指针的特性,以及如何正确理解argv[0]到argv[argc-1]的含义,提供了一个助记方法帮助读者更好地记忆argv参数的构成。

在NS2代码库中,经常看到以(int agrc,const char* const* argv)为参数的函数。

按照下面转载中提及的 读法,应读为 argv is (a pointer to (a const pointer ( to a const char))).

argv其实就是个二级指针(即是指向指针的指针),第一个const修鉓是表示argv指向的指针指向了一个常量,不能修改;第二个const修鉓是表示argv指向的指针是个常量,不能对其进行增减操作。

argv[0]其实就是argv指向的第一个指针(char* 类型指针),它实际上指向 一个以'/'结束的字符串。

一般情况下:argv[0]-argv[argc-1] 存储着函数的各个参数。

 

 

********************//以下转载自其它博客


Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 
把一个声明从右向左读。
 

char * const cp; ( * 读成 pointer to ) 
cp is a const pointer to char 

const char * p; 
p is a pointer to const char; 

char const * p;

 

char ** p1; //    pointer to    pointer to   


char const char **p2;//    pointer to    pointer to const char


char * const * p3;//    pointer to const pointer to char


const char * const * p4;//    pointer to const pointer to const char


char ** const p5;// const pointer to    pointer to    char


const char ** const p6;// const pointer to    pointer to const char char * const * const p7;// const pointer to const pointer to    char

const char * const * const p8;// const pointer to const pointer to const char

 

### 宏定义中重复声明 `func_name` 的作用与原因 在 C 语言中,宏定义中重复声明函数名(如 `func_name`)通常是为了实现更灵活的调试和日志记录功能。这种做法的核心目的是通过预定义宏(如 `__func__` 或 `__FUNCTION__`)捕获当前函数的名称,并将其嵌入到自定义的日志或调试信息中[^1]。 #### 1. 提高代码可读性和维护性 通过将函数名作为参数传递给宏定义,可以避免硬编码函数名带来的错误风险。例如,如果手动输入函数名,可能会因拼写错误导致日志信息不准确。而使用预定义宏 `__func__` 或 `__FUNCTION__` 则能确保函数名始终正确[^2]。 ```c #define MY_LOG(message) \ do { \ fprintf(stderr, "[%s] %s: %s\n", __FILE__, __func__, message); \ fflush(stderr); \ } while (0) ``` 在此宏定义中,`__func__` 动态地获取当前函数的名称,无需开发者手动输入,从而减少了出错的可能性[^3]。 #### 2. 实现动态错误定位 在复杂的项目中,错误定位是一个关键问题。通过在宏定义中重复声明 `func_name`,可以将函数名、文件名和行号等信息组合起来,形成详细的错误报告。这种方法有助于快速定位问题所在[^4]。 ```c #define ERROR_LOG(message) \ do { \ fprintf(stderr, "ERROR in %s:%d [%s]: %s\n", __FILE__, __LINE__, __func__, message); \ fflush(stderr); \ } while (0) ``` 上述宏定义中,`__func__` 提供了当前函数的名称,结合 `__FILE__` 和 `__LINE__`,能够精确定位错误发生的位置。 #### 3. 支持多级别日志记录 在实际开发中,可能需要支持不同级别的日志记录(如调试、警告、错误)。通过在宏定义中重复声明 `func_name`,可以根据不同的日志级别动态生成相应的日志信息。 ```c #define DEBUG_LEVEL 3 #define LOG_DEBUG(level, message) \ do { \ if (level <= DEBUG_LEVEL) { \ fprintf(stderr, "DEBUG [%s:%d][%s]: %s\n", __FILE__, __LINE__, __func__, message); \ fflush(stderr); \ } \ } while (0) ``` 此宏定义中,`__func__` 被用于标识日志信息所属的函数,便于后续分析和排查问题。 #### 4. 提升代码复用性 通过宏定义中的 `func_name` 声明,可以创建通用的日志或调试工具,减少重复代码的编写。这种方式不仅提高了代码的复用性,还增强了项目的可维护性。 ```c #define GENERIC_LOG(level, func_name, message) \ do { \ fprintf(stderr, "[%d] %s: %s\n", level, func_name, message); \ fflush(stderr); \ } while (0) GENERIC_LOG(1, __func__, "This is a test log"); ``` 在此示例中,`__func__` 动态传递当前函数的名称,使得 `GENERIC_LOG` 宏可以适用于任何函数。 --- ### 示例代码 以下是一个综合示例,展示了如何在宏定义中重复声明 `func_name` 并结合其他预定义宏使用: ```c #include <stdio.h> #define LOG_INFO(message) \ do { \ fprintf(stdout, "INFO [%s:%d][%s]: %s\n", __FILE__, __LINE__, __func__, message); \ fflush(stdout); \ } while (0) #define LOG_ERROR(message) \ do { \ fprintf(stderr, "ERROR [%s:%d][%s]: %s\n", __FILE__, __LINE__, __func__, message); \ fflush(stderr); \ } while (0) void example_function() { LOG_INFO("This is an informational message."); LOG_ERROR("This is an error message."); } int main() { example_function(); return 0; } ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值