我应该何时inline在C++中为函数/方法编写关键字?
看到一些答案,一些相关的问题:
我应该何时不写在C++函数/方法关键字"内联"?
什么时候编译器不知道何时使函数/方法'内联'?
当一个应用程序为函数/方法写入"内联"时,是否多线程是否重要?
我刚刚加入了一个新的C++软件项目,我正在尝试理解这个设计.该项目经常使用未命名的命名空间.例如,类定义文件中可能会出现这样的情况:
// newusertype.cc
namespace {
const int SIZE_OF_ARRAY_X;
const int SIZE_OF_ARRAY_Y;
bool getState(userType*,otherUserType*);
}
newusertype::newusertype(...) {...
Run Code Online (Sandbox Code Playgroud)
可能导致使用未命名的命名空间的设计注意事项是什么?有哪些优点和缺点?
const static int foo = 42;
Run Code Online (Sandbox Code Playgroud)
我在StackOverflow上的一些代码中看到了这个,我无法弄清楚它是做什么的.然后我在其他论坛上看到了一些困惑的答案.我最好的猜测是它在C中用来隐藏foo其他模块的常量.它是否正确?如果是这样,为什么有人会在C++上下文中使用它,你可以做到这一点private?
可能是重复的,但不是一个容易搜索的...
给出如下标题:
namespace ns1
{
class MyClass
{
void method();
};
}
Run Code Online (Sandbox Code Playgroud)
我看到method()在.cpp文件中以多种方式定义:
namespace ns1
{
void MyClass::method()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
using namespace ns1;
void MyClass::method()
{
...
}
Run Code Online (Sandbox Code Playgroud)
void ns1::MyClass::method()
{
...
}
Run Code Online (Sandbox Code Playgroud)
有没有'正确'的方法呢?这些都是"错误的",因为它们并不都意味着同样的事情吗?
链接器报告重复的符号:
#ifndef testttt
#define testttt
void anything(){
std::cout<<"hellooooooo";
}
#endif
Run Code Online (Sandbox Code Playgroud)
因为它在包含防护内部,所以我希望这个函数只定义一次.但显然不是.
我知道我可以把static它放在它前面然后它会工作(我仍然觉得具有讽刺意味,因为静态应该给它内部链接,但该函数可以从多个cpp文件中使用).
所以我想我的两部分问题是:1)为什么包含警戒不会阻止此功能的多个定义,就像它们对其他标题项一样,2)为什么这个static词在静态应该阻止名称可见时解决这个问题在其他翻译单位?我添加它,我实际上可以从包含此头文件的任何地方调用此函数.
C++中的static全局和非static全局标识符有什么区别?
我有一大堆常量,我想在我的代码的不同部分访问,但我希望能够轻松访问整个:
static const bool doX = true;
static const bool doY = false;
static const int maxNumX = 5;
Run Code Online (Sandbox Code Playgroud)
等等
所以我创建了一个名为"constants.h"的文件,并将它们全部放在那里,并将#included包含在任何需要知道常量的文件中.
问题是,这对于编译时来说很糟糕,因为每次更改常量时,都必须重建constants.h引用的所有文件.(另外,据我所知,因为它们是静态的,所以每次在新的.cpp中包含constants.h时,我都会在代码中生成doX/doY/maxNumX的副本,导致在编译时浪费千字节的空间EXE - 有没有办法看到这个?).
所以,我想要一个解决方案.如果可能的话,不是"仅在使用它们的文件中声明常量".
有什么建议?
我有可能是一个愚蠢的问题,但我只是不理解我的书对它的解释.
它说"当编译器看到模板的定义时,它不会生成代码.它只在我们实例化模板的特定实例时生成代码.事实上代码只在我们使用模板时生成(而不是在我们使用模板时生成定义它)影响我们组织源代码的方式以及何时检测到错误...要生成实例化,编译器需要具有定义函数模板或类模板成员函数的代码.因此,与非模板代码不同,模板的标题通常包括定义和声明."
"生成代码"究竟是什么意思?我想我从来没有真正考虑过编译器发生了什么,并且对它没有太多了解,所以当你编译模板函数或类与非模板函数或类相比时,我不理解它们有什么不同
可能重复:
C++中的"翻译单元"是什么
通常说在C/C++中声明的静态变量在编译单元中是不可见的?这是否意味着每个.c或.cpp文件是一个单独的编译单元?那个.h文件和.h文件中声明的静态变量怎么样?.h文件是否也被视为一个单独的编译单元?
我有两个文件:
File1.cpp
File2.cpp
Run Code Online (Sandbox Code Playgroud)
File1是我的主类,它有main方法,File2.cpp有一个类调用ClassTwo,我想在File1.cpp中创建一个ClassTwo对象
我一起编译它们
g++ -o myfile File1.cpp File2.cpp
Run Code Online (Sandbox Code Playgroud)
但是当我尝试创造时
//创建第二类对象
ClassTwo ctwo;
Run Code Online (Sandbox Code Playgroud)
它不起作用.
错误是
ClassTwo未在此范围内声明.
这是我的main.cpp
#include <iostream>
#include <string>
using namespace std;
int main()
{
//here compile error - undeclare ClassTwo in scope.
ClassTwo ctwo;
//some codes
}
Run Code Online (Sandbox Code Playgroud)
这是我的File2.cpp
#include <iostream>
#include <string>
using namespace std;
class ClassTwo
{
private:
string myType;
public:
void setType(string);
string getType();
};
void ClassTwo::setType(string sType)
{
myType = sType;
}
void ClassTwo::getType(float fVal)
{
return myType;
}
Run Code Online (Sandbox Code Playgroud)
得到了将我的File2.cpp拆分成另一个.h文件的响应但是如果我声明一个类,我如何将它拆分成另一个.h文件,因为我需要维护变量(私有)和函数的公共和私有(公共) )如何在main方法中将ClassTwo ctwo转换为File1.cpp
c++ ×10
namespaces ×2
c ×1
coding-style ×1
constants ×1
identifier ×1
inline ×1
oop ×1
static ×1