我使用CMake创建一个makefile.CMake创建包含绝对路径的GCC线.
为了加快编译速度,我使用ccache.
从不同位置构建相同的代码(例如,几个开发人员编译相同的代码,每个代码在其主目录下)导致ccache缓存未命中.
这里有一个代码来演示一个恼人的问题:
class A {
public:
A():
m_b(1),
m_a(2)
{}
private:
int m_a;
int m_b;
};
Run Code Online (Sandbox Code Playgroud)
这是Console视图上的输出:
make all
Building file: ../test.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"test.d" -MT"test.d" -o"test.o" "../test.cpp"
../test.cpp: In constructor 'A::A()':
../test.cpp:9: warning: 'A::m_b' will be initialized after
../test.cpp:8: warning: 'int A::m_a'
../test.cpp:3: warning: when initialized here
Finished building: ../test.cpp
Run Code Online (Sandbox Code Playgroud)
问题是在Problems视图中我会看到3个单独的警告(输出中包含警告字的行),而输出中确实有4行描述了一个问题.
有什么我想念的吗?
补充问题.也许这是Eclipse精神,但有一种方法可以像大多数IDE一样使Console视图可点击(例如Visual Studio,emacs ......)
谢谢迪马
如果我理解正确版本的subversion定义:
一旦我们安装了svn服务器,我们就不会触摸/升级它.
在客户端,事情变得更加复杂.
在客户端(Windows),我们目前使用tortoisesvn.它的版本(如果我错了,请纠正我)对应于颠覆版本.
现在,我们将我们的应用程序移植到Linux,因此我们考虑使用其他svn客户端(svn命令行实用程序,Eclipse插件和一些GUI前端).
现在的问题是:
有几个不同的客户可以使用相同的结账代码吗?如果是,那么这意味着我需要刻意拿起要使用的客户端版本,因为每个客户端都希望在.svn目录中找到特定的格式/数据?
服务器版本和客户端之间有什么关系?例如,如果服务器端是1.4而客户端是1.6,那么这意味着某些1.6功能不起作用?
我有一个类具有私有数据成员的类vector< A*>.
该类有两个实际使用的公共方法vector<A*>::size_type:
我可以在类的公共部分添加以下typedef:
typedef vector :: size_type SIZE_t;
但恕我直言,它暴露了太多关于类实现的细节.
另一种方法是使用size_t.
你怎么看?
我是Linux内核开发的新手.
困扰我的一件事是声明和初始化变量的方式.
我的印象是代码使用C89/ANSI C的变量声明放置规则(变量在块的开头声明),而C99放宽了规则.
我的背景是C++,很多人建议"非常聪明的人"尽可能在本地声明变量 - 在同一条指令中更好地声明和初始化:
在Linux内核中初始化变量的可接受方法是什么?
考虑以下make:
all: a b
a:
echo a
exit 1
b:
echo b start
sleep 1
echo b end
Run Code Online (Sandbox Code Playgroud)
在make -j2我收到以下输出时运行它:
echo a
echo b start
a
exit 1
b start
sleep 1
make: *** [a] Error 1
make: *** Waiting for unfinished jobs....
echo b end
b end
Run Code Online (Sandbox Code Playgroud)
我们有一个很大的make文件,很容易错过错误,因为在执行结束时没有错误消息.
是否有一种方法可以在make执行结束时出现错误消息?
更新:
请参阅我的可能解决方案如何从make中检查make退出状态.
这是我的线程类的骨架:
class MyThread {
public:
virutal ~MyThread();
// will start thread with svc() as thread entry point
void start() = 0;
// derive class will specialize what the thread should do
virtual void svc() = 0;
};
Run Code Online (Sandbox Code Playgroud)
在代码的某处我创建了一个实例,MyThread后来我想要销毁它.在这种情况下MyThread~MyThread()被称为.MyThread:svc()仍在运行并使用对象的数据成员.因此MyThread:svc(),在继续使用析构函数之前,我需要礼貌地告知停止旋转.
破坏线程对象的可接受方法是什么?
注意:我正在寻找平台无关的解决方案.
UPD:很明显问题的根源在于C++对象代表线程和OS线程之间没有关系.所以问题是:在对象去除的上下文中,是否有一种可接受的方法可以使线程对象像普通的C++对象一样运行,或者它应该被视为一个不寻常的对象(例如,我们应该在调用它之前调用join()吗?
乌尔里希·德雷珀(Ulrich Drepper)的醉酒,看到两个看似令人困惑的参赛作品.
在第一个(全局空间中的字符串)中,Ulrich声明字符串应定义为:
const char _pcre_ucp_names[] = "blabla";
Run Code Online (Sandbox Code Playgroud)
虽然已经在第二个(函数中的字符串),他认为它应该声明为:
static const char _pcre_ucp_names[] = "blabla";
Run Code Online (Sandbox Code Playgroud)
你能解释什么是更好的名称来解析一个字符串?
UDP:
首先,我删除了C++标记 - 这个问题对C和C++都有效.所以我认为答案不能解释类/函数/文件范围中的静态意义是否相关.
在回答之前阅读文章.文章涉及内存使用 - 存储实际数据(在.rodata或.data部分),字符串应该重新定位(如果我们谈论unix/linux共享对象),是否可以更改字符串与否.
UDP2 在第一个中,它表示对于全局变量的形式:
(1) const char *a = "...";
Run Code Online (Sandbox Code Playgroud)
不太好
(2) const char a[] = "..."
Run Code Online (Sandbox Code Playgroud)
为什么?我一直认为(1)更好,因为(2)实际上复制了我们分配它的字符串,而(1)只指向我们分配的字符串.
我有一个以下形式的结构:
struct foo {
bool has_value;
int value;
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个宏,它可以用来赋值,如下所示:
ASSIGN(foo) = 0;
or
ASSIGN(foo) += 5;
Run Code Online (Sandbox Code Playgroud)
当宏为:
#define ASSIGN(s) \
s->has_value = true; s->value
Run Code Online (Sandbox Code Playgroud)
然而,宏并不安全。在下面的示例中,if将“吃掉”宏的第一部分ASSIGN。
if (cond)
ASSIGN(foo) += 5;
Run Code Online (Sandbox Code Playgroud)
关于如何确保安全有什么建议ASSIGN 吗?
c++ ×4
c ×3
coding-style ×2
compilation ×2
linux ×2
ccache ×1
cmake ×1
eclipse ×1
eclipse-cdt ×1
gcc ×1
gnu-make ×1
linux-kernel ×1
macros ×1
makefile ×1
signals ×1
stl ×1
svn ×1