在C++中通常用某种前缀命名成员变量来表示它们是成员变量而不是局部变量或参数.如果你来自MFC背景,你可能会使用m_foo.我myFoo偶尔也见过.
C#(或者可能只是.NET)似乎建议只使用下划线,如_foo.这是否允许C++标准?
这似乎是一个简单的问题,但我无法通过Stack Overflow搜索或Google找到它.什么类型后跟一个_t意思?如
int_t anInt;
Run Code Online (Sandbox Code Playgroud)
我在C代码中看到很多意味着与硬件紧密相关 - 我不禁认为它们是相关的.
在编写项目时,我遇到了一个奇怪的问题.
这是我设法编写的用于重新创建问题的最小代码.我故意将一个实际的字符串存储在其他地方,并分配了足够的空间.
// #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stddef.h> // For offsetof()
typedef struct _pack{
// The type of `c` doesn't matter as long as it's inside of a struct.
int64_t c;
} pack;
int main(){
pack *p;
char str[9] = "aaaaaaaa"; // Input
size_t len = offsetof(pack, c) + (strlen(str) + 1);
p = malloc(len);
// Version 1: crash
strcpy((char*)&(p->c), str);
// Version 2: crash
strncpy((char*)&(p->c), str, strlen(str)+1);
// Version 3: works!
memcpy((char*)&(p->c), str, strlen(str)+1); …Run Code Online (Sandbox Code Playgroud) C++有时使用后缀_type上类型定义(例如std::vector<T>::value_type),有时也被_t(例如std::size_t),或没有后缀(正常的类,并且也像类型定义std::string这是真的std::basic_string<...>)
什么时候使用哪个名称有什么好的约定?
我试图在C中构建一个基本的链表.我似乎得到这个代码的错误:
typedef struct
{
char letter;
int number;
list_t *next;
}list_t;
char letters[] = {"ABCDEFGH"};
list_t openGame, ruyLopez;
openGame.letter = letters[4];
openGame.number = 4;
openGame.next = &ruyLopez;
ruyLopez.letter = letters[5];
ruyLopez.number = 4;
ruyLopez.next = NULL;
Run Code Online (Sandbox Code Playgroud)
它不接受我在结构中的定义:
list_t *next;
Run Code Online (Sandbox Code Playgroud)
出于同样的原因,它不会接受:
openGame.next = &ruyLopez;
Run Code Online (Sandbox Code Playgroud) 我理解下划线t(_t)用于标识类型_type,通常在typedef语句中使用下划线类型().
是否存在略微不同的用法(例如,模板的下划线类型,但非模板的下划线)?
为什么它们不用于声明?例如:
class person_t { };
enum error_t { };
Run Code Online (Sandbox Code Playgroud)这与下一个关于下划线t的问题不同,因为它还要求下划线类型之间的差异.此外,(明显地)两个后缀都只是惯例(但很明显,为什么它们都在C++标准中使用)并不明显.例如,std :: size_t vs std :: istream :: pos_type.
我不熟悉C++ 0x.我大约6个月前就开始学习C++了,虽然我对初学者有很强的掌握.
我有一个模板类:
template <typename T>
class Node
{
...
}
Run Code Online (Sandbox Code Playgroud)
然后,我有这个:
template <typename T>
class BinaryTree
{
protected:
typedef Node<T>* node_t;
...
}
Run Code Online (Sandbox Code Playgroud)
这里,二叉树类充当"基类",可以通过二叉树的特化来扩展.(AVL Tree,Red-Black等)节点typedef受到保护,因为想法是专业化将能够使用它......它们可以,但它看起来非常糟糕.
例如,在我的BiTree类(我最常用的二叉树的创意名称,基本上是BST)中,我们有:
template <typename T>
class BiTree : public BinaryTree<T>
{
private:
typedef typename BinaryTree<T>::node_t node_t; // Yuck
...
}
Run Code Online (Sandbox Code Playgroud)
更糟糕的是,我是那些喜欢在类之外指定函数的人之一,所以当我想说node_t是返回类型时...好吧,看看......
template <typename T>
typename BiTree<T>::node_t
BiTree<T>::insert(BiTree<T>::node_t& node, T data)
{
...
}
Run Code Online (Sandbox Code Playgroud)
有没有办法只使用node_t?这就是从基类继承typedef的重点.这是usingC++ 0x中关键字的用途吗?我将如何应用于这种情况?谢谢.
编辑:我想知道它是否有用的原因是因为这个问题:C++模板typedef
我只是出于好奇而感到奇怪,为什么是C时间结构
struct tm
Run Code Online (Sandbox Code Playgroud)
用作此而不是用typedef.这样我总是需要编写struct tm,以获得正确的代码.很多结构都是"类型确定的",为什么不这个呢?