第二次课
安全函数
strcpy/strcat/strlen有安全隐患, 都以'\0'结尾, 有安全隐患
char * strcpy ( char * destination, const char * source );
windows下的安全函数
errno_t strcpy_s( char *dest, rsize_t dest_size, const char *src);字节数
errno_t __cdecl strcpy_s(_Out_writes_z_(_SizeInBytes) char * _Dst, _In_ rsize_t _SizeInBytes, _In_z_ const char * _Src);
errno_t __cdecl wcscpy_s(_Out_writes_z_(_SizeInWords) wchar_t * _Dst, _In_ rsize_t _SizeInWords, _In_z_ const wchar_t * _Src);
只会拷取指定长度字符, debug版和release版有区别
linux下的安全函数
char *strncpy(char *dest, const char *src, size_t n);
字符编码
ASCII, Unicode, utf-8, gbk, big5
gbk: VS下的中文编码方式
Unicode: 通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以, VS中的编码
utf-8: 可变长度, 根据前导来判断字节长度, 网络通信倾向于utf-8
网络传输中要把其他字符转换成utf-8发送来接收
wchar_t* ps = L"中国人";
char* p = "xxx";
int WSAAPI send( // WSAAPI表示windows socket api
SOCKET s,
const char *buf,
int len,
int flags
);
int n = send(s, (const char*)ps, 6, 0); // 发送'\0'字符应该是8
VS中预编译头文件必须写在第一行
匈牙利命名法
//sz/psz
char buf[64];
char szBuf[64]; // string terminated with zero
char* psz = "helloworld"; // point to size terminated with zero?
int nName;
float fName;
DWORD dwName;
WORD wName;
int g_Name; // 全局变量
class A {
private:
int m_iName; // 私有成员
};
HWND hwndName;
HINSTANCE hName;
HDC hdcName;
对于 for-each 循环,尽量使用 const &,其次是 &,最后才是拷贝
for (const Json::Value& jMarketBookLevel : jData)
{
//循环中不会修改 jData 的值
}
for (Json::Value& jMarketBookLevel : jData)
{
//循环中会修改 jData 的值
}
for (Json::Value jMarketBookLevel : jData)
{
//循环中需要拷贝 jData 的值做修改
}
在 Visual Studio 菜单【Tools】->【Options】-> 【Text Editor】-> 【C/C++】-> 【Tabs】将 Tab size 设置成插入四个空格,而不是插入\t。
申请内存或者栈变量大数组(长度超过 4)尽量使用 4 的倍数
//错误的做法
char sz[99];
//正确的做法
char sz[100];
成员变量名称对齐
正确的做法
class CKafkaMDClient :public CMarketBase
{
private:
KafkaMDHandler *m_pMDhandler;
KConsumer *m_pSnapConsumer;
KConsumer *m_pIncConsumer;
std::vector<RdKafka::TopicPartition*> m_vecIncTopicpartitionList;
std::string m_strSnapTopic;
std::string m_strIncTopic;
using SnapInstrumentMap = CHashMap<char *, SnapInstrument *, HashString>;
SnapInstrumentMap m_snapInstrumentMap;
};
错误的做法
class A
{
private:
// 指向CFtdcMduserApi实例的指针
CQdFtdcMduserApi *m_pUserApi;
CQdFtdcReqUserLoginField m_reqUserLogin;
CMDFlowManager *m_pFlowManager;
CFTDCPackage m_mdMessage;
//收报每个报文之前确定主题号
int m_nTopicID;
int m_nTopicType;
//收到每个报文之前确定序号
int m_nSequenceNo;
//每个api的号
int m_nNumber;
bool m_wsSend;
QuWSFront *m_qwsfront;
CMarketDataHandler *m_pMarketDataHandle;
CTradingDayType m_tradingDay;
};
子类重写父类的函数需要加上override关键字, 不用加 virtual
class A : B
{
public:
void OnRtnMBLMarketData(CQdFtdcMBLMarketDataField *pMBLMarketData) override;
};
尽量将类的基元数据类型(bool, char, short, int, long, 指针类型)放在一起
正确做法
class A
{
private:
bool c;
int a;
int b;
bool d
bool c;
st s;
CXX xx;
};
错误做法:
class A
{
private:
int a;
st s;
int b;
CXX xx;
bool c;
};

浙公网安备 33010602011771号