在C++中通常用某种前缀命名成员变量来表示它们是成员变量而不是局部变量或参数.如果你来自MFC背景,你可能会使用m_foo.我myFoo偶尔也见过.
C#(或者可能只是.NET)似乎建议只使用下划线,如_foo.这是否允许C++标准?
我正在研究一个已知只能在Windows上运行并在Visual Studio下编译的代码库(它与excel紧密集成,所以它不会去任何地方).我想知道我是否应该使用传统的包含警卫或#pragma once用于我们的代码.我认为让编译器处理#pragma once会产生更快的编译,并且在复制和粘贴时不易出错.它也稍微不那么难看;)
注意:为了获得更快的编译时间,我们可以使用Redundant Include Guards,但这会在包含的文件和包含文件之间增加紧密耦合.通常它没关系,因为防护应该基于文件名,并且只有在你需要改变包含名称时才会改变.
我一直看到人们写
class.h
#ifndef CLASS_H
#define CLASS_H
//blah blah blah
#endif
Run Code Online (Sandbox Code Playgroud)
问题是,为什么它们也不会为包含类函数定义的.cpp文件执行此操作?
假设我有 main.cpp,main.cpp包括class.h.该class.h文件不会导入任何内容,所以如何main.cpp知道该中的内容class.cpp?
我现在正在阅读一些开源代码,我在这个 C 头文件的顶部看到以下代码行:
#ifndef __BASH_H__
#define __BASH_H__
Run Code Online (Sandbox Code Playgroud)
我没有__BASH_H__在代码库的其他任何地方看到引用,所以我怀疑它是间接使用的(即由 shell、C 编译器或第三方库),而不是由代码本身使用。
我在谷歌上搜索了“ BASH_H ”,我看到它被其他开源库使用(即这里和这里),所以我假设我的假设方向是正确的。
然而,Google 搜索结果不包含任何关于此声明、其目的、用途等的官方文档。我只看到总共 2 页的搜索结果,其中大部分看起来无关紧要。
我假设它在某种程度上与 相关bash,但我对缺乏官方文档感到困惑。有人能指出我正确的方向吗?
我是编程的新手,头文件的主题在我开始使用它们之后会让我失望.除此之外,我正在尝试使用预编译的头文件.我也在使用SFML库,所以我必须包含那些标题.
现在我有stdafx.h,main.cpp,然后是Ah,A.cpp,Bh,B.cpp,Ch,C.cpp,Dh和D.cpp中包含的类A,B,C和D.
如果包含所有文件中的标题,我将采用什么顺序?
stdafx.h中:
#include <SFML/Graphics.hpp>
#include <iostream>
Run Code Online (Sandbox Code Playgroud)
啊
#include "stdafx.h"
class A
{
//sfml class
};
Run Code Online (Sandbox Code Playgroud)
A.cpp
#include "stdafx.h"
#include "A.h"
Run Code Online (Sandbox Code Playgroud)
BH
#include "stdafx.h"
class B
{
//sfml class
};
Run Code Online (Sandbox Code Playgroud)
B.cpp
#include "stdafx.h"
#include "B.h"
Run Code Online (Sandbox Code Playgroud)
章
#include "B.h"
class C: public B
{
};
Run Code Online (Sandbox Code Playgroud)
C.cpp
#include "stdafx.h"
#include "C.h"
Run Code Online (Sandbox Code Playgroud)
DH
#include "A.h"
#include "C.h"
class D
{
A a;
C C; // if left uncommented I recieve a '1 unresolved externals' error
//sfml class
}
Run Code Online (Sandbox Code Playgroud)
D.cpp …
为什么有时我会看到
#define __Empty_macro__
Run Code Online (Sandbox Code Playgroud)
在c?它的用途是什么?恩.
#ifndef _BUILDIN_H_
#define _BUILDIN_H_
//codes never used _BUILDIN_H_ ...
#endif /* _BUILDIN_H_ */
Run Code Online (Sandbox Code Playgroud)
ex source是一个shell工具:https://github.com/dingdongnigetou/shell/blob/master/include/build_in.h
这是我的问题的代码,我得到4个错误:
- student.obj:错误LNK2005:"struct Node*admitedFirstNode"(?admitedFirstNode @@ 3PAUNode @@ A)已在main.obj中定义
- student.obj:错误LNK2005:已在main.obj中定义的"struct Node*allFirstNode"(?allFirstNode @@ 3PAUNode @@ A)
- student.obj:错误LNK2005:已在main.obj中定义的"struct Node*rejectedFirstNode"(?rejectedFirstNode @@ 3PAUNode @@ A)
- pb4_OOP_lab1\Debug\pb4_OOP_lab1.exe:致命错误LNK1169:找到一个或多个多重定义的符号
#include "students.h" //main
int main()
{
for(int i=0;i<NR_STUDENTS;i++)
{
Student *s1=new Student;
cout<<"Enter name: ";
getline(cin,s1->name);
cout<<"Enter garde: ";
cin>>s1->grade;
cin.ignore();
addStudent(s1);
delete s1;
}
}
#include "students.h" //students.cpp
void AddNodeToList(Node *firstNode, Student *studToAdd)
{
Node *nodeToAdd=new Node;
nodeToAdd->student=studToAdd;
nodeToAdd->next=NULL;
if(firstNode==NULL)
{
firstNode=nodeToAdd;
}
else
{
Node *temp;
temp=firstNode;
while(temp->next != NULL)
{
temp=temp->next;
}
temp->next=nodeToAdd;
}
}
void addStudent(Student …Run Code Online (Sandbox Code Playgroud) 我正在重用CMake项目中的一些autotools项目的一些C/C++源文件,我看到许多源文件散落着如下行:
#ifdef HAVE_UNISTD_H
#include <unistd.h> // for getpid()
#endif
Run Code Online (Sandbox Code Playgroud)
我会理解这个构造的目的,如果getpid()是可选的,并且它的调用被等效的HAVE_UNISTD_H指令包围.但是,没有HAVE_UNISTD_H源文件不编译,抱怨getpid()没有定义.这比让我知道unistd.h没有找到的编译器感觉更加神秘.
当然,这只是一个例子.其他流行的宏包括HAVE_STDINT_H,HAVE_INTTYPES_H等等,其存在是编译源文件所必需的.
为什么要包括HAVE_*警卫?我觉得他们只会带来不利因素:
HAVE_*定义正确的宏.#includes与#ifdefs 混合.我需要一个Arduino库的简单示例.
我读到这个:https://www.arduino.cc/en/Hacking/LibraryTutorial
这对我来说有点复杂 - 我从代码示例中理解得更好.
我需要为Arduino构建一个库.在库内部,我需要有2个函数,每个函数接收3个字符串值.然后该函数需要将值连接到一个大字符串并发送使用的值创建Serial.println(the new value);
我只需要它进行演示.所以,这些价值观对我来说并不重要.这样我才能从中学习.我想用这种方式使用它.
className.Function1("val1", "val2", val3");
className.Function2("val1", "val2", val3");
Run Code Online (Sandbox Code Playgroud)
文件应该有什么扩展名(.h .cpp)?当然我试图使用Arduino的库,但它们非常复杂.
如果有人有例子,我相信它会帮助我理解.
我的档案是
main.c
#include"A.h"
#include"B.h"
Run Code Online (Sandbox Code Playgroud)
A.c
#include"A.h"
Run Code Online (Sandbox Code Playgroud)
B.c
#include"B.h"
Run Code Online (Sandbox Code Playgroud)
我有一个文件,我已经定义了几个结构,我应该在所有文件中使用A.c , B.c, main.c,甚至是头文件A and B.
因此,我有
A.h并且B.h都有
#include"struct.h"
Run Code Online (Sandbox Code Playgroud)
现在,我在main.c中看到了
我将对这两个结构进行多次声明,如何摆脱这个问题.我的结构会改变什么?
谢谢
c++ ×6
c ×4
header ×2
arduino ×1
autotools ×1
bash ×1
c++-faq ×1
class ×1
coding-style ×1
compilation ×1
include ×1
macros ×1
precompiled ×1
standards ×1
visual-c++ ×1