argc, argv 源码
时间: 2023-12-14 14:00:33 浏览: 22
argc 和 argv 是 C 和 C++ 编程语言中的两个命令行参数传递机制。它们是作为 main 函数的参数传入的。
argc 是一个整数类型的变量,它存储了命令行参数的数量。它表示了在命令行中输入的参数的个数,包括程序本身。因此,argc 至少为1,即程序的名称本身。
argv 是一个指向指针数组的指针,它存储了命令行参数的值。它是一个字符串数组,每个元素都是一个指向字符串的指针。argv[0] 存储了程序的名称,而后续的元素存储了命令行输入的参数值。
在程序执行时,当我们在命令行中输入参数时,编译器将这些参数作为字符串传递给程序,并将其存储在 argv 数组中。使用指针数组的好处是我们可以在程序中通过访问 argv 数组的不同元素来获取和处理命令行参数的值。
例如,如果我们有一个程序叫做 example,并在命令行中键入以下命令:example parameter1 parameter2 parameter3
那么在代码中,argc 的值将是 4(参数数量+1),而 argv 数组将包含以下内容:
argv[0] = "example"
argv[1] = "parameter1"
argv[2] = "parameter2"
argv[3] = "parameter3"
通过 argc 和 argv,我们可以根据需要获取和处理命令行参数。这对于向程序传递配置信息或者运行程序时传递参数非常有用。这样,我们可以在不更改程序源代码的情况下,通过命令行来操作程序的行为。
相关问题
getprop源码
getprop命令是Android系统中的一个工具,用于获取系统属性值。其源码位于system/core/toolbox/getprop.c文件中。
下面是getprop源码中的主要函数:
```c
int main(int argc, char** argv) {
// 读取命令行参数
parse_args(argc, argv);
// 打开系统属性文件
int fd = open(PROP_FILENAME, O_RDONLY | O_CLOEXEC);
if (fd < 0) {
error_exit("could not open '%s': %s", PROP_FILENAME, strerror(errno));
}
// 读取系统属性文件,并输出指定属性的值
char buffer[PROP_VALUE_MAX];
while (ReadPropertyLine(fd, buffer)) {
if (match_prefix(buffer, g_prop_name)) {
printf("%s\n", get_value(buffer));
close(fd);
return 0;
}
}
// 没有找到指定属性
close(fd);
return 1;
}
```
该函数首先调用`parse_args`函数解析命令行参数,然后打开系统属性文件,逐行读取属性值并查找指定属性。如果找到了指定属性,则输出其值并返回0。如果没有找到指定属性,则返回1。
ReadPropertyLine函数用于读取属性文件中的每一行,其实现如下:
```c
static bool ReadPropertyLine(int fd, char* buffer) {
char* p = buffer;
while (true) {
if (read(fd, p, 1) != 1) {
return false;
}
if (*p == '\n') {
*p = '\0';
return true;
}
if (++p - buffer >= PROP_LINE_MAX) {
error_exit("line too long in property file");
}
}
}
```
该函数从指定文件描述符中读取一个字符,并将其存储到缓冲区中。如果读取到换行符,则将其替换为字符串结束符号,并返回true。如果缓冲区已满,则调用`error_exit`函数退出程序。
match_prefix函数用于检查属性是否以指定的前缀开头,其实现如下:
```c
static bool match_prefix(const char* buffer, const char* prefix) {
return strncmp(buffer, prefix, strlen(prefix)) == 0;
}
```
如果属性以指定前缀开头,则返回true。
get_value函数用于获取属性值,其实现如下:
```c
static char* get_value(char* buffer) {
char* value = strchr(buffer, '=');
if (value == NULL) {
error_exit("badly formed property line");
}
// 返回属性值
return value + 1;
}
```
该函数在属性行中查找等号(=),并返回等号后面的字符串作为属性值。
以上就是getprop命令的源码实现。
GoogleTest Demo源码
以下是一个简单的 GoogleTest Demo 的源码:
```c++
#include <gtest/gtest.h>
int add(int a, int b) {
return a + b;
}
TEST(addTest, testPositiveNumbers) {
EXPECT_EQ(add(2, 2), 4);
EXPECT_EQ(add(10, 20), 30);
}
TEST(addTest, testNegativeNumbers) {
EXPECT_EQ(add(-2, -2), -4);
EXPECT_EQ(add(-10, -20), -30);
}
TEST(addTest, testMixedNumbers) {
EXPECT_EQ(add(2, -2), 0);
EXPECT_EQ(add(10, -20), -10);
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
```
这个 Demo 包含一个名为 `add` 的函数和三个测试用例,分别测试正数、负数和混合数字两数相加的结果。在测试用例中,使用 `EXPECT_EQ` 宏来断言测试结果是否符合预期。在 `main` 函数中,使用 `::testing::InitGoogleTest` 函数来初始化 GoogleTest 并运行所有测试用例。