一些c/c++常见遇见的问题

1.cpp包含不同目录的同名头文件,实际使用哪个头文件?

总结:
1、cpp中使用哪个同名头文件由CMakeLists.txt中包含的先后顺序决定,使用前面的,后面的被忽略。
2、为避免麻烦,禁止定义同名头文件。

参考链接:https://blog.csdn.net/qq_33726635/article/details/115979696

2. C语言编译报错error: variably modified ‘***’ at file scope

总结:

  • 报错原因
    在数组声明中使用了只读类型。
    造成此报错的原因是由于使用了类似一下的代码

  • 在C语言中,const不是一个真真正正的常量,其代表的含义仅仅是只读

  • 解决方法:使用宏定义#define代替只读类型const

参考链接:https://blog.csdn.net/qq_15144867/article/details/93341737

3. memset赋值的坑

需要注意的是memset赋值的时候是按字节赋值,是将参数化成二进制之后填入一个字节。就比如前面的例子中,想要通过memset(a,100,sizeof a)给int类型的数组赋值,你给第一个字节的是一百,转成二进制就是0110 0100,而int有四个字节,也就是说,一个int被赋值为
0110 0100,0110 0100,0110 0100,0110 0100,对应的十进制是1684300900,根本不是你想要赋的值100,这也就解释了为什么数组中的元素的值都为1684300900。
————————————————
memset赋值时只能赋值为0?
答案肯定不是,比如任意字符都是可以的,初始化成0是最常用的。int类型的一般都是赋值0或-1,其他的值都不行。

结论
为地址str开始的n个字节赋值c,注意:是逐个字节赋值,str开始的n个字节中的每个字节都赋值为c。
(1) 若str指向char型地址,value可为任意字符值;
(2) 若str指向非char型,如int型地址,要想赋值正确,value的值只能是-1或0,因为-1和0转化成二进制后每一位都是一样的,设int型占4个字节,则-1=0XFFFFFFFF, 0=0X00000000。
————————————————
通过memset函数的介绍,上述初始化是将数组a的每个元素赋值为0x3f3f3f3f。0x3f3f3f3f 真的是个非常精巧的常量
他的十进制是 1061109567也就是109级别的,和0x7fffffff一个数量级,0x7fffffff是int类型的最大值,即231-1=2,147,483,647。
————————————————

参考

posted @ 2023-07-12 15:29  胖白白  阅读(122)  评论(0编辑  收藏  举报