[TOC]

C++/C

学习和膜拜:https://codechina.csdn.net/mirrors/fengbingchun/messy_test

1、isspace

用于检查参数c是否为空格字符。 头文件:ctype.h

2、std::string::npos

std::string::npos是一个常数,它等于size_type类型可以表示的最大值,用来表示一个不存在的位置,类型一般是std::container_type::size_type。

#include <iostream>

int main(int argc, char *argv[]) {
    size_t a = -1;
    std::cout << "a : " << a << std::endl;
    std::cout << "npos : " << std::string::npos << std::endl;
    std::cout << "size_type max : " << std::numeric_limits<std::string::size_type>::max() << std::endl;
    std::cout << "size_t max : " << std::numeric_limits<size_t>::max() << std::endl;
    std::cout << "uint64_t max : " << std::numeric_limits<uint64_t>::max() << std::endl;
    return 0;
}


结果都是:18446744073709551615

3、replace

c里面的string也有replace函数。

4、字符串太长怎么办

#include <iostream>
#include <string>
using namespace std;

int main()
{
    //错误示例下一行前不能有空格
    char chstr[] = "abcabc\
                   abcabc";
    //错误示例'\'要紧挨着换行处的字符
    char chstr1[] = "abcabc \
abcabc";
    //方法1
    char chstr2[] = "abcabc\
abcabc";
    //方法2
    char chstr3[] = "abcabc"
        "abcabc";
    return 0;
}

5、作用域运算符

::是运算符中等级最高的,它分为三种:全局作用域符,类作用域符,命名空间作用域符 。

全局作用

全局作用域符号:当全局变量在局部函数中与其中某个变量重名,那么就可以用::来区分如:

char ch; //全局变量
void sleep()
{
    char ch; //局部变量
    ch(局部变量) = ch(局部变量) *ch(局部变量) ;
    ::ch(全局变量) =::ch(全局变量) *ch(局部变量);
}

6、结构体使用memset初始化

像结构体使用地址符号:

struct _node {
    int x;
}node;

memset(&node, 0, sizeof(node));

int arr[10];
memset(arr, 0, sizeof(arr));

7、或运算不支持和等号简写

#include <iostream>
using namespace std;

int main()
{
    int ret = 0;
    int x = 1;
    //ret ||= x;  //错误expected primary-expression before ‘=’ token
    ret = ret || x;
    cout << ret << endl;
    return 0;
}

8、错误: 程序中有游离的‘\xxx’

这个错误一般是由于你程序(a.c)中使用了中文的标点符号,比如;,},+。改成英文的就行了。甚至有时候空格也会出现类似错误,删掉该空格 重新输入。如果找不出来,解决的办法就是关闭中文输入法然后把有错这一行重新敲一遍。

我的原因是:#define MAX_CNT 8 最大数量 错误提示地方是MAX_CNT使用的地方,实际是宏定义注释未// 宏定义必须换行定义

9、switch里面的参数只能是整型变量

switch(expression){
    case constant-expression  :
       statement(s);
       break; // 可选的
    case constant-expression  :
       statement(s);
       break; // 可选的

    // 您可以有任意数量的 case 语句
    default : // 可选的
       statement(s);
}

switch 语句中的 expression 必须是一个整型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。

10、error: cast from 'void*' to 'int' loses precision

11、去掉warning:cast to pointer from integer of different size(从不同大小的整数转化为指针)

如何去掉warning呢, (void*)(long)virt_to_bus(yuv_frames) 这样warning就去掉

12、没有包含头文件unistd.h

close’ was not declared in this scope
‘read’ was not declared in this scope
‘sysconf’ was not declared in this scope

没有包含头文件 unistd.h 造成的。

加上

include

13、C++ Builder

C++ Builder是由Borland公司推出的一款可视化集成开发工具。C++ Builder具有快速的可视化开发环境:只要简单地把控件(Component)拖到窗体(Form)上,定义一下它的属性,设置一下它的外观,就可以快速地建立应用程序界面;C++ Builder内置了100多个完全封装了Windows公用特性且具有完全可扩展性(包括全面支持ActiveX控件)的可重用控件;C++ Builder具有一个专业C++开发环境所能提供的全部功能:快速、高效、灵活的编译器优化,逐步连接,CPU透视,命令行工具等。它实现了可视化的编程环境和功能强大的编程语言(C++)的完美结合。

14、pair头文件

#include <utility>
using namespace std;

一般来说

15、理解一段代码

// 使用vscode可以看到展开结果
// qualifier修饰符、修饰词

#define Q_TAILQ_ENTRY(type, qual)                                       \
struct {                                                                \
        qual type *tqe_next;            /* next element */              \
        qual type *qual *tqe_prev;      /* address of previous next element */\
}
#define QTAILQ_ENTRY(type)       Q_TAILQ_ENTRY(struct type,)
#define QTAILQ_ENTRY_CONST(type)       Q_TAILQ_ENTRY(struct type, const)

QTAILQ_ENTRY(int);
/*
Expands to:

struct { struct int *tqe_next; struct int * *tqe_prev; }
*/

QTAILQ_ENTRY_CONST(int);
/*
Expands to:

struct { const struct int *tqe_next; const struct int *const *tqe_prev; }
*/
static
__attribute__
#if
#ifdef
#endif
#undef
...
va_list
va_start
va_end
va_copy
vsnprintf

snprintf

fopen
fread
fgets
fscanf
fprintf
fclose

fd:open
无类型void指针参数好处:传进来后方便强制转换成其他格式,常常给struct,可以自动分配位置。
f
side bar:侧边栏

uint8_t

getopt.h
poll.h
fcntl.h
signal.h
socket.h
types.h
time.h
netdb.h
netinet/in.h
对于这些我一般很少遇到的头文件,建议使用一下常用的函数例子



#define debug "abcd" "234"

or

cout << "abc" "123" << endl;
都是正确的语法。

16、需要理解

博客:https://www.cnblogs.com/zhangyabin---acm/p/3188076.html

## 0和NULL

在不同的系统中,NULL并非总是和0等同,NULL仅仅代表空值,也就是指向一个不被使用的地址,在大多数系统中,都将0作为不被使用的地址,所以就有了类似这样的定义

#define NULL 0

但并非总是如此,也有些系统不将0地址作为NULL,而是用其他的地址,所以说,千万别将NULL和0等价起来,特别是在一些跨平台的代码中,这更是将给你带来灾难。

17、MTU

https://yq.aliyun.com/articles/222535

18、c语言报错-- no previous prototype for function

当我们使用了一个函数,但是没有在头文件中声明时,就会出这个错误。 有时是因为去掉了static。static的函数使用和普通函数还是有区别的。static函数不需要声明。 解决办法,头文件中添加声明即可。

19、!! 两次取反

两次取反是将对应的类型转换为boolean。第一次取反将变量转换为了bool值,但结果是相反的,所以第二次取反获得正确的结果。

单冒号(:)
    有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为: 
    struct 位域结构名 
    { 位域列表 }; 
其中位域列表的形式为: 类型说明符 位域名:位域长度 
例如: 
struct bs 
{ 
  int a:8; 
  int b:2; 
  int c:6; 
}; 
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如: 
struct bs 
{ 
  int a:8; 
  int b:2; 
  int c:6; 
}data; 
说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明: 
1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如: 
struct bs 
{ 
  unsigned a:4 
  unsigned :0 /*空域*/ 
  unsigned b:4 /*从下一单元开始存放*/ 
  unsigned c:4 
} 


在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。 
2. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如: 
struct k 
{ 
  int a:1 
  int :2 /*该2位不能使用*/ 
  int b:3 
  int c:2 
}; 

从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。

20、C程序中的raise和kill两个函数有何不同?

在Linux上执行“man raise”,即可看到两者的区别: LIBC库函数,raise基于系统调用kill或tgkill(如果内核支持)实现 kill是系统调用,不是LIBC库函数 单线程程序:raise(sig)效果等同kill(getpid(), sig) 多线程程序:raise(sig)效果等同pthread_kill(pthread_self(), sig)

在多线程程序中,进程给自己发SIGTERM信号退出,应当调用“kill(getpid(), SIGTERM)”,而不是“raise(SIGTERM)”

21、bool类型

头文件:stdbool.h

bool是C++的关键字,一种数据类型,长度是4!!! _Bool是C99新增加的关键字,长度是1, 在C++中,又把bool重定义为_Bool ,typedef bool _Bool;

怎么写程序都是1个字节,并不是4个字节。

21、JNI

JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境。

results matching ""

    No results matching ""