有什么用途:
static_castdynamic_castconst_castreinterpret_cast(type)valuetype(value)如何决定在哪些特定情况下使用哪个?
昨晚我工作到很晚,试图从源代码构建Linux的GLFW 3软件包.这个过程花了我很长时间,总共大约3个小时,部分是因为我不熟悉CMake,部分是因为我不熟悉GLFW.
我希望这篇文章能够帮助你摆脱昨天的困难!我想我应该写一篇简短的文章,希望能为你节省几个小时的生命......
感谢#glfw IRC频道上的"urraka","b6"和"niklas",我已经能够使用glfw 3.0.1版了.
事实证明,这不是一个简单的过程(当然不适合我,我不是专家),因为网上没有太多关于glfw3的文档,尤其是关于使用CMake进行设置的文档.
我被要求将其分成问题和答案部分,所以我已经这样做了,答案部分现在在下面.
如果GLFW3的任何维护者看到这个,那么我给他们的信息是请在你的网站上添加"在Windows,Mac OS X和Linux上设置GLFW3"部分!使用GLFW编写程序非常容易,因为在线文档非常好,可以快速扫描所有可用的类和模块,然后您就可以开始了.这里展示的测试项目的例子也非常好.我发现的两个主要问题是,首先如何在我的系统上设置GLFW3,其次是如何构建GLFW3项目?对于非专家来说,这两件事可能还不够清楚.
今天简单介绍一下(日期:2014-01-14),看起来GLFW网站自从我上次查看以来已经发生了很大的变化,现在有一个关于用GLFW编译GLFW和建筑程序的部分,我认为这是新的.
所以我写了一个程序来测试64位kubuntu linux上的线程,版本13.04.实际上我从正在编写测试程序的其他人那里抢了代码.
#include <cstdlib>
#include <iostream>
#include <thread>
void task1(const std::string msg)
{
std::cout << "task1 says: " << msg << std::endl;
}
int main(int argc, char **argv)
{
std::thread t1(task1, "Hello");
t1.join();
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
我编译使用:
g++ -pthread -std=c++11 -c main.cpp
g++ main.o -o main.out
Run Code Online (Sandbox Code Playgroud)
然后跑了:
./main.out
Run Code Online (Sandbox Code Playgroud)
顺便说一下,当我使用-l'时,main.out会像所有可执行文件一样以绿色文本显示,但在其名称的末尾也有一个星号.为什么是这样?
回到手头的问题:当我运行main.out时,出现了一个错误,其中说:
terminate called after throwing an instance of 'std::system_error'
what(): Operation not permitted
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
任何有关如何解决此问题的想法?
正如标题所示,我遇到的最终问题是多个定义链接器错误.我实际上已经修复了问题,但我没有以正确的方式解决问题.在开始之前,我想讨论将类文件拆分成多个文件的原因.我试图把所有可能的场景放在这里 - 如果我错过任何一个,请提醒我,我可以做出改变.希望以下是正确的:
原因1 为了节省空间:
您有一个文件,其中包含所有类成员的类声明.您可以在此文件周围放置#include防护(或#pragma一次),以确保在#include包含在源文件中的两个不同头文件中的文件时不会发生冲突.您可以使用此类中声明的任何方法的实现来编译单独的源文件,因为它会从源文件中加载许多行代码,这会清除一些内容并为您的程序引入一些顺序.
示例:如您所见,可以通过将类方法的实现拆分为不同的文件来改进以下示例.(.cpp文件)
// my_class.hpp
#pragma once
class my_class
{
public:
void my_function()
{
// LOTS OF CODE
// CONFUSING TO DEBUG
// LOTS OF CODE
// DISORGANIZED AND DISTRACTING
// LOTS OF CODE
// LOOKS HORRIBLE
// LOTS OF CODE
// VERY MESSY
// LOTS OF CODE
}
// MANY OTHER METHODS
// MEANS VERY LARGE FILE WITH LOTS OF LINES OF CODE
}
Run Code Online (Sandbox Code Playgroud)
原因2 要防止多个定义链接器错误:
也许这就是你将实现与声明分开的主要原因.在上面的示例中,您可以将方法主体移动到类外部.这将使它看起来更清洁和结构化.但是,根据这个问题,上面的例子有隐式inline说明符.将实现从类中移动到类外部(如下例所示)将导致链接器错误,因此您可以内联所有内容,或将函数定义移动到.cpp文件. …
好的,所以我已经知道为什么我需要GLEW,但只有一点.
如果我使用现代OpenGL的东西,可能是从版本3.0开始,和/或使用核心配置文件,那么GLEW是必需的,因为没有它编译产生的错误,如未glGenVertexArrays声明.
所以GLEW做了一些背景工作,包括我们想要使用的现代OpenGL函数.
除此之外,还有什么其他的吗?另外,它是如何工作的.
举个例子,它是否改进了跨平台编译?(例如,如果从Linux迁移到Windows或OS X,需要对代码进行少量修改?
它是否也改善了图形硬件的"跨平台性"?例如,假设我们有两台相同的计算机,包括操作系统.在一个系统上使用OpenGL 4.3命令编译程序.如果其他系统有只支持OpenGL 3.3的显卡或驱动程序,那么GLEW会帮忙吗?(也许是为旧版OpenGL编译着色器?)
所以你可能会发现我实际上并不知道GLEW做了什么或它是如何做到的.
最后一点; 有谁知道如何使用GLEW与GLFW?我可能会将其作为一个单独的问题发布.
在C中使用volatile关键字来防止编译器对变量执行某些优化以及其他细微更改.
例如;
volatile int my_int = 0;
Run Code Online (Sandbox Code Playgroud)
创建一个整数.在某些情况下,它可能会阻止以下优化:
while(my_int == 0); // Loop until my_int != 0
Run Code Online (Sandbox Code Playgroud)
优化到:
while(1); // Loop infinity.
Run Code Online (Sandbox Code Playgroud)
这对于包括嵌入式系统中经常遇到的情况很有用,例如可以通过中断函数调用对变量进行修改的情况.还有许多其他这种技术有用的例子.my_int可以是由这种功能修改的标志.(这只是一个玩具模型.)
但是,请考虑函数修改的数据是数组的情况.数据可以由指针指向.
unsigned char* my_data = new unsigned char[256];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,考虑到是my_data在这个问题上的该特定情况的全局变量[1],是volatile关键字冗余的,或者它仍需要?
[1]可能无关紧要.
如果答案是需要volatile关键字,那么使用正确的语法是什么?
例如,volatile unsigned char* my_data我假设声明指针本身是易失性的,而不是它指向的数据.
最后,C和C++的使用有区别吗?
我有这样一个文件:
[data.json]
{
"electron": {
"pos": [0,0,0],
"vel": [0,0,0]
},
"proton": {
"pos": [1,0,0],
"vel": [0,0.1,0]
},
"proton": {
"pos": [-1,0,0],
"vel": [0,-0.1,-0.1]
}
}
Run Code Online (Sandbox Code Playgroud)
如何通过解析此文件来创建粒子矢量.据我所知,我需要使用boost读取文件并将字符串(行)读入向量,然后解析向量的内容.
类粒子是这样的:
class Particle
{
private:
particle_type mtype; // particle_type is an enum
vector<double> mPos;
vector<double> mVel;
};
Run Code Online (Sandbox Code Playgroud)
在类中省略了get/set的其他方法.
基本上我想帮助创建一个vector<Particle>正确的位置和速度数据和解析到其中的particle_type数据.提前致谢.
代码主要:
int main(){
boost::property_tree::ptree pt;
boost::property_tree::read_json("data.json", pt);
}
Run Code Online (Sandbox Code Playgroud) 我已经安装了 Gitea,每次创建新存储库时,它都会默认主分支名称为“main”,我觉得这有点烦人。
有没有办法让它默认回到正常的“主”命名约定?如果是这样我该怎么做?
对于A类,整数转换运算符看起来像;
operator int() //Here we don't specify any return type
{
return intValue;
}
Run Code Online (Sandbox Code Playgroud)
当上面的函数看起来没有指定返回值类型时,它是如何返回一个值的?它似乎没有返回"任何东西",但我知道它不是void.
如果未指定返回类型,这有何意义?
我希望能够定义一个包含一些数据成员的类,以及一个可以访问那些私有数据成员的函数.
然后我想要一个公共函数,它创建一些线程,它们对类的数据成员进行操作.我在编译代码时遇到了一些麻烦.
不要担心互斥或数据保护,这不会成为问题,因为这只是一些用于测试的示例代码.
class foo {
public:
void make_foo_func_threads();
private:
void foo_func();
char private_data;
std::vector<std::thread> some_threads;
}
void foo::foo_func() {
while(1) {
private_data = 'A';
}
}
void foo::make_foo_func_thread() {
for(...) some_threads.push_back(std::thread(foo_func));
for(...) some_threads.join();
}
Run Code Online (Sandbox Code Playgroud)
编译器给我错误:
'没有匹配调用std :: thread :: thread()'
显然有"用于从参数1没有已知的转换<unresolved overloaded function type>到void (foo::*&&)'.
嗯,是的,我不知道这意味着什么除了编译器在理解如何解决foo_func方面有困难 - 我想.
我如何帮助编译器理解我想要做什么,所以它不会再困扰我了.毫无疑问,我写的代码是不合法的,如果是这样,有人可以解释为什么对我来说就是这种情况.谢谢!