我知道这个问题以前已经被问过无数次了,但我仍然有麻烦。
我从一个包含所有代码的main.cpp文件开始。假设它看起来像这样:
int a = 0;
void foo() {
a+1;
}
void bar() {
a+2;
}
int main() {
foo();
bar();
a + 3;
}
现在我想将这段代码拆分到多个文件中,以便于管理。我希望只有一个头文件、header.h和三个.cpp文件:main.cpp、foo.cpp和bar.cpp。
自动取款机,这是我的:
//header.h
int a = 0;
void foo();
voi
举个例子:
// myheader.h
static int myStaticVar = 0;
// If we remove 'static' the compiler will throw linker error.
void DoStuff();
// and myheader.cpp, and main.cpp; etc
这就是我要解释的:
静态变量没有外部链接,当我们在没有“静态”的情况下编译时,我们将“包括”每个文件中的静态变量(在这里是全局的),因为不允许多次声明,创建重复项和链接器的静态变量会抛出一个错误。
有什么更好的方法解释这件事吗?谢谢。
P
因此,我最近试图清理我的代码,试图让我自己(如果需要的话,也可以让其他人更容易)更容易。
现在,这可能是因为我对整个C++有点陌生(不过,我还有几年的Java经验)。但是我听说(更像是阅读)在你的头文件中包含头文件是一个坏主意,因为它会使你的程序的其余部分陷入泥潭,并使事情变得令人头疼(事实上,我遇到了一些问题,我只需要在".cpp“文件中包含一个头文件,而且它(显然)包含了我需要的所有内容)。
因此,我决定对我的头文件执行以下操作:
#pragma once
class Game {
(...)
public:
SDL_Window* getPrimaryWindow(vo
我过去常常使用以下代码来确保不会多次加载包含文件。
#ifndef _STRING_
#include <string>
#endif
// use std::string here
std::string str;
...
这一技巧在“C++的应用编程接口设计”一书中进行了说明。
现在我的同事告诉我,这在Visual Studio中是不必要的,因为如果字符串的实现头文件包含#pragma once,则不需要包含保护来提高编译速度。
对吗?
引用自原著:
7.2.3 Redundant #include Guards
Another way to reduce the overh
基本上,我已经定义并定义了这个结构:
typedef struct{
void** elements;
int numElements;
int itemSize;
int capacity;
int dynamicElements;
}array;
为此,我编写了附带的动态数组操作函数。然而,我有一个小问题。在各种函数中,我将此结构作为参数传递。为了模块化代码,我需要在头文件中创建这些函数的原型(为了允许数组类型的参数,我需要在这些头文件中包含"array.h“)。
因此,在包含了我所有的头文件之后,"array.h“头文件已经被包含了
将函数保存在头文件中并将其包含到主源文件中更好,还是将函数保存在源文件中并将其链接到主源文件中?
一些库将函数保存在各自的源文件中,这些源文件是在一个特殊的头文件中声明的。当您在主源文件中包含该头文件时,可以链接所有这些函数。但是,它为每个源文件创建一个对象文件(不是吗?)我在想,将函数保存在包含在一个特殊头文件中的头文件中,难道不是更有效吗?
包括职能
#include <foo.h>
#include <boo.h>
int main() {
}
链接函数
int foo();
int boo();
int main() {
}
我正在尝试创建一个编译特定程序的Makefile。
我有1x的.cpp文件和2x的.h文件。
所以我会去
g++ source.cpp header1.h header2.h -o programOut
问题是我得到了一个错误。
主要在第二个头文件中,其中约会是在第一个头文件中定义的类。第二个头文件主要包含(函数原型?)我只是获得了我使用的其他函数,删除了实现并将其放入其中。
error: ‘Appointments’ does not name a type
error: ISO C++ forbids declaration of ‘left’ with no type
error: ‘A
我只是花了一段时间调试一个多定义错误,但我不清楚为什么会发生这种行为,我想了解一下。
我在头文件中有类似的东西。
//foo.h
#pragma once
my_states States[N] = {...};
稍后,bar.h包括foo.h,因为bar.cpp具有需要了解my_states的函数。
这个问题是在我为bar编写单元测试并在test.cpp中包含bar.h时出现的。
bar.o: multiple definition of MyNamespace::named_states
test.o: first defined here
我已将问题改为
constexpr my_st
现在,我只是试图使用微软的Windows从源代码构建libsamperate,但我遇到了一个配置检查问题我以前安装过FFTW & libsndfile,它们的包含文件lib文件和pkg-config文件都在正确的位置,但当我使用sh ./configure为libsamprate生成makefile时,输出总是提到
checking for pkg-config... no
checking for SNDFILE... no
我还设置了PKG_CONFIG_PATH(usr/local/lib/pkgconfig),并尝试了很多次,但结果似乎是一样的
有人知道这件事吗?