文章目录
0 前言
本博客主要记录C++使用过程中的一点偏门问题。
//2022.11.7
之前一直苦于找不到一个很好的C++的参考资料,这里找到一个:
1 带参数执行
在C/C++中,常用的控制台程序中main函数都是不传参数的,这样相当于无参数执行,但main函数完整的定义结构是有参数的:
int main(int argc, char *argv[]);
其中,argc
代表参数的个数(argument count),argv
代表各个参数的首地址(一个指针数组)(argument value),而且需要注意的是,argc
是传入参数个数+1;argv[0]
实际上就是该程序所在地址,只读。
那这个怎么使用呢?一般是先编译运行,然后在命令行中执行程序时传入参数即可。
同样,在python中也有类似的传入参数执行的操作,具体可以看一下这个链接。
2 C语言中执行命令行操作并保存到文件
最近才知道,C语言中的system("pause");
等一些类似的语法,实际上就是在命令行中输入引号中的字符串,实现调用系统的一些功能。那能不能使用这个语法来执行一些相对复杂的指令,而且最好是可以将执行结果返回回来。
保存命令行执行得到的结果一般有两种方式,一种是在文件中写入特定的内容,需要使用到echo
指令,使用格式:echo 内容 > 文件路径
,举个例子
echo hello "C:\Users\Zeoy\Desktop\1.txt"
上面这个例子是将hello内容写入到一个txt文件中。参考链接
但其实更常用的是执行完一个指令之后获取其执行结果,这个时候就不需要加echo
指令了,直接使用>
符号即可。看下面这个例子
ipconfig > C:\Users\Zeoy\Desktop\1.txt
(路径的引号可加可不加)
上面这个指令实现的是执行ipconfig
指令,然后将返回内容写入到txt文件中。参考链接
不过,需要注意的是,以上两种方式如果指令中有特殊符号的话,需要使用^
进行转义。此外,在C语言编写时,如果字符串中有特殊符号,也需要进行转义,但使用的符号是\
,所以在C语言中需要进行两次转义:
//命令行中的ipconfig > C:\Users\Zeoy\Desktop\1.txt
char s[50] = "ipconfig > ^\"C:^\\Users^\\Zeoy^\\Desktop^\\1.txt^\"";
system(s);
脑洞大开:将上面两种操作结合一下,是不是可以实现在C语言中调用python代码执行的结果?这样也就是运行C语言程序要求具有python环境 [狗头]
3 C语言中获取文件自身路径的方法
4 exit(0)与exit(1)、return区别
5 函数传入任意长度的参数
众所周知,C++是支持传入默认参数的,但是没办法像MATLAB一样直接传入一个向量。比如在计算一个向量中元素之和时,就会有类似的需求。但经过室友的提醒,发现C++传的参数还可以是STL,如 <vector>
,这样就能大致实现上面的需求。下面是一个例子。【来自室友】
#include <iostream>
#include <initializer_list>
#include <vector>
using namespace std;
template <typename T>
void func (initializer_list<T> argList)
{
vector<T> args = argList;
cout<< args.size()<< endl;
if (args.size()>2) cout<< args[2]<< endl;
for (auto s: args) cout<< s<< ' '; cout<< endl;
}
int main ()
{
func ({1,2,3,4,5});
func ({"123","abc"});
return 0;
}
6 C++中的“\”符号
C++中使用 \
进行续行,常见于一些较长的宏定义,一行写不下,为了美观和可读性,强制将其分为两行。
7 const int * 和 int * const 等的区别
搜索和const int
相关的内容时意外找到上面两篇关于区分这些语句的博客,发现他们写得有点模糊,于是和室友一讨论,总结出一条更加容易理解的方式。
首先需要明确,这种问题大概只有三种情况:指向常量的指针(指针可变,但指向的内容不可变)和指向变量的常指针(指针不可变,但指向的内容可变)以及这两者的叠加(指针和指向的内容都是常量不可变)。
-
理解方式一:以星号为分界,星号左边是指针指向内容的修饰,且
const int
与int const
等价,星号右边是指针的修饰。所以:const int * p
:指针指向是一个整形常量,指针可变,指向内容不变;int * const p
:指向一个整形变量的常指针,指针不可变,指向的内容可变;
-
理解方式二:从左往右看,遇到一个
int const
orconst int
表示指向变量的类型,遇到一个*
,表示加一层可变指针,遇到一个* const
,表示加一层常量指针。【这种理解方式比较适合理解多重指针的情况】
虽然把这个问题暂时性整明白了,但是个人觉得没必要细究这些,毕竟不常用,编程不至于此!
一个边角知识点 //2022.12.2:
如果定义一个指针指向一个常量(如 char *s = "Hello"
),那么就不能通过该指针来修改该变量,需要注意!
8 类内typedef
最近看代码看到一个在类内使用typedef
的代码,感觉很新奇,找了一些资料,如下。参考链接
typedef long INDEX
给long
这样的类型起别名,它有两个用处:一是表明该类型的特殊作用,二是将来有可能要改变这种类型(比如提高精度)- C++引入“仅在类内部起作用的类型别名”,其初衷应该不难理解:通过限制该类型别名的作用域来防止冲突。在函数体内部
typedef
,这个别名在函数体以外不可以使用,也就是说,“类型别名”和变量、函数一样具有作用域。 - 如果该语句放在
public
段中,则可以在类外部使用,而如果放在private
段中,则只能在类内使用。举个例子:
class MyClass
{
public:
typedef long INDEX;
...
};
调用:
MyClass::INDEX usercode;//声明一个变量