我正在尝试使用makefile设置一个构建过程,用于我正在处理的C++插件.我很想知道是否有办法在另一个目录中找到g ++编译源文件.我这样做的动机是避免必须为每个源文件指定相对路径,如下所述.
我的项目目录结构如下:
MyPlugin --> src --> Foo.cpp
--> Foo.h
--> Bar.cpp
--> Bar.cpp
--> build --> Makefile
Run Code Online (Sandbox Code Playgroud)
以下是我当前Makefile的精简版:
SRC_PATH=../src
OUT_PATH=../bin
VPATH=${SRC_PATH}
FILES=Foo.cpp Bar.cpp
CC=g++
CFLAGS=-Wall -shared
all:
mkdir -p ${OUT_PATH}
${CC} ${CFLAGS} -I${SRC_PATH} ${FILES} -o ${OUT_PATH}/MyPlugin.so
Run Code Online (Sandbox Code Playgroud)
通过这样做,我试图避免定义FILES
变量如下:
FILES=../src/Foo.cpp ../src/Bar.cpp
Run Code Online (Sandbox Code Playgroud)
当我尝试运行时make all
,g ++给了我一个错误.看起来通过-I
flag 指定的路径仅用于搜索#include
d文件.
g++: Foo.cpp: No such file or directory
g++: Bar.cpp: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我不能使用通配符(*.cpp
)因为我并不总是希望拾取所有文件进行编译.另一种方法是cd
src目录,提到这里,并从那里运行G ++,但只适用于我,如果所有文件在同一目录下(我需要的输出是一个单一的.so
文件).我也试过设置环境变量PATH
,但似乎没有任何影响. …
我想定义一个全局容器(C++ 03),这是我尝试过的一个示例代码,它不起作用.
#include <vector>
#include <string>
using namespace std;
vector<string> Aries;
Aries.push_back("Taurus"); // line 6
int main() {}
Run Code Online (Sandbox Code Playgroud)
编译错误:
prog.cpp:6:1: error: 'Aries' does not name a type
Run Code Online (Sandbox Code Playgroud)
我似乎可以定义一个空的全局向量,但无法填充它.看起来在C++ 03中,我也无法指定初始化器,例如:
vector<string> Aries = { "Taurus" };
Run Code Online (Sandbox Code Playgroud)
我在这里犯了错误,或者我如何解决这个问题?
我尝试在StackOverflow上搜索,看看之前是否已经回答了这个问题,但是只发现了这些帖子:C++中的全局对象,在C++中定义全局常量,这对此没有帮助.
我想仅在某些(编译时)条件为真时才声明友元类.例如:
// pseudo-C++
class Foo {
if(some_compile_time_condition) {
friend class Bar;
}
};
Run Code Online (Sandbox Code Playgroud)
我没有在互联网上找到任何解决方案.我在编译时动态地完成了生成结构问题的所有答案.他们中的许多人使用C++ 11 std::conditional
,但我想知道是否可以在不使用预处理器的情况下在C++ 03中执行此操作.
此解决方案/sf/answers/796369731/将无法工作,因为friend
未继承船舶(具有继承的朋友类).
编辑只是为了使这更容易看到,如下面评论中所述:此要求不常见.这是我正在研究的硬件模拟新研究项目的一部分.测试平台是用C++编写的,我想在波形中显示变量.我已经研究了各种其他选项,并且friend class
由于实际考虑,我发现我需要使用a .朋友将捕获值并生成波形,但我更愿意仅在需要波形时才拥有朋友,而不是所有时间.
编译器优化有时可以跳过对没有任何后果的某些语句的评估.但是,这也适用于逗号运算符吗?
以下代码在ideone上运行时没有任何错误,但我预计它会崩溃.
#include <iostream>
int main() {
int x = (1/0, 2);
std::cout << x << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如果我将语句更改为,程序会崩溃 int x = 1/0;
我观察到,在 doxygen 1.8.2 中,不能将受保护的代码块放置在缩进级别超过 2的缩进列表中(在降价文件中)。在下面的片段中:
- Level 1
~~~
printf("Hello world Level 1");
~~~
- Level 2
~~~
printf("Hello world Level 2");
~~~
- Level 3
~~~
printf("Hello world Level 3");
~~~
Run Code Online (Sandbox Code Playgroud)
的Hello world Level 1
和Hello world Level 2
出现在输出作为代码段,但Hello world Level 3
(和~
它周围的多个)显示为明文输出。
我犯了什么错误,或者这是一个已知的限制?
有没有办法把代码块作为带有doxygen markdown的blockquote?这在引用参考书籍等时非常有用.我尝试了以下内容,但它不会以固定宽度字体打印代码.
> Put the following line in your program:
>
> printf("Hello, world.");
Run Code Online (Sandbox Code Playgroud)
我希望它看起来像(我使用SO的降价来说明):
将以下行放在您的程序中:
Run Code Online (Sandbox Code Playgroud)printf("Hello, world.");
在C++(03)类中,我有一个成员变量,在对象构造期间必须为其赋值.但是,只有派生类才能计算所需的值.正如本文所讨论的,C++是否要求您从派生类初始化基类成员?,我知道派生类不能初始化基类成员,但是赋值对我来说已经足够了.
因此,我在基类中提供了一个赋值的方法,但我无法弄清楚如何强制派生类调用它.以下示例代码说明了这一点.
class Base {
public:
Base() {}
setFoo(unsigned inFoo) { foo = inFoo; }
private:
unsigned foo;
};
class Derived : public Base {
Derived() : Base() {
unsigned desired = ... // do calculations to get the desired value
setFoo(desired); // --> how to ensure that derived class calls this?
}
};
Run Code Online (Sandbox Code Playgroud)
在foo
随后其他几个基类的方法使用.即使我在其中设置了"标志" setFoo()
,也没有"后构造函数"方法,我可以检查它.在基类中还有其他几种方法foo
可供使用.我可以在那里检查它,但它太繁琐,容易出错并且效率低下.
如果以前曾经问过我,我很抱歉.在尝试通过搜索"确保派生类构造函数必须调用特定基类方法"和"强制派生类来分配基类成员"之前,我确实尝试在此处找到它.我遇到了一些有用的帖子如何在C++的派生类'构造函数中初始化基类的const变量?并强制派生类使用基类的构造函数,但遗憾的是它们没有解决我的问题.
你能否建议我采取适当的方法来解决这种情况?编译时检查解决方案是可取的,但如果不可行,运行时检查也会有所帮助.虽然我不能将C++ 11用于我的问题,但我也很乐意学习任何C++ 11解决方案.谢谢你的考虑.
编辑当然,将此作为一项要求进行记录也是一种选择,但我想了解是否有程序化解决方案.
Edit2 …
将64位常量指定为
int64_t foo = 0x1234LL;
Run Code Online (Sandbox Code Playgroud)
是不便携的,因为long long
不一定int64_t
.这篇文章哪个初始化程序适合int64_t?讨论了使用INT64_C()
宏<stdint.h>
,但是也不可能使用static_cast
as
int64_t foo = static_cast<int64_t>(0x1234);
Run Code Online (Sandbox Code Playgroud)
?
我应该选择哪一个,为什么,或者两者都运作良好?
我在互联网上搜索了SO,但没有找到任何static_cast
选项被探索的地方.我也做过测试,sizeof()
以确认它在简单的情况下工作.
我知道在命令模式下,ct{char}
从当前光标位置删除所有文本直到下一个匹配{char}
,然后可以通过继续键入来替换.
例如,假设文本是:
abcdefgh
Run Code Online (Sandbox Code Playgroud)
并且光标打开b
,然后键入ctg
将删除bcdef
,可以通过继续键入来替换.
但这仅适用于单个匹配字符.是否可以通过匹配字符序列来完成此操作,例如,使用gh
代替g
,在上面的例子中?
注意:我知道s///
可以使用,但这更快,更方便.
我曾经git add -p
将我的代码更改拆分为多个提交.但是,在此git commit
之后执行所有更改,包括未分阶段的更改.我看了几个关于SO的问题,但没有发现任何明显的错误.你能帮我理解我做错了什么吗?以下是我尝试的命令及其输出.
bash-3.2$ git diff test11.txt
diff --git a/test11.txt b/test11.txt
index f077274..e811cae 100644
--- a/test11.txt
+++ b/test11.txt
@@ -1,5 +1,5 @@
-Hello
-World
+hello
+world
-Blahblahblah
-blah
+blahblahblah
+Blah
bash-3.2$ git add -p test11.txt
diff --git a/test11.txt b/test11.txt
index f077274..e811cae 100644
--- a/test11.txt
+++ b/test11.txt
@@ -1,5 +1,5 @@
-Hello
-World
+hello
+world
-Blahblahblah
-blah
+blahblahblah
+Blah
Stage this hunk [y,n,q,a,d,/,s,e,?]? s
Split into 2 hunks.
@@ -1,3 +1,3 @@
-Hello
-World …
Run Code Online (Sandbox Code Playgroud) 要从两个int
s的除法中获得浮点结果,我们就是static_cast
其中一个操作数float
,如下所示:
int a = 2;
int b = 3;
float c = static_cast<float>(a) / b; // c = 0.666666
float d = a / static_cast<float>(b); // d = 0.666666
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,static_cast
编辑哪个操作数无关紧要.但是,假设其中一个操作数是编译时常量,而另一个不是,如下所示:
int a = foo(); // value not available at compile-time.
const int b = SOME_CONSTANT; // compile-time constant.
Run Code Online (Sandbox Code Playgroud)
编译器优化是否会对两者产生任何影响static_cast
,如下所述?
float c = static_cast<float>(a) / b;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器可以b
用其值替换,但由于a
未知,因此强制转换只能在运行时进行.
float d = a / static_cast<float>(b);
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,编译器知道b
,因此它可以在编译时进行转换,并b …
在gitk视图中,我注意到一些(但不是全部)git标签缺失.git tag
显示这些标签,我也可以通过指定这些标签来结账,以便正确创建标签.我应该尝试了解并调试此问题?
K&R在C编程语言中进行了练习,以查找各种类型的最大/最小值,例如char和int.
在以下代码中:
#include<stdio.h>
#include<limits.h>
void main()
{
printf("Size of Char Max %d\n", CHAR_MAX);
printf("Max Char+1 = %d\n",CHAR_MAX+1); //my test code
}
Run Code Online (Sandbox Code Playgroud)
既然CHAR_MAX
是127,这是类型的最大值char
,为什么不加1会导致溢出?