小编Mas*_*Man的帖子

g ++编译存在于另一个目录中的源文件

我正在尝试使用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 ++给了我一个错误.看起来通过-Iflag 指定的路径仅用于搜索#included文件.

g++: Foo.cpp: No such file or directory
g++: Bar.cpp: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我不能使用通配符(*.cpp)因为我并不总是希望拾取所有文件进行编译.另一种方法是cdsrc目录,提到这里,并从那里运行G ++,但只适用于我,如果所有文件在同一目录下(我需要的输出是一个单一的.so文件).我也试过设置环境变量PATH,但似乎没有任何影响. …

c++ gcc makefile g++

4
推荐指数
1
解决办法
1万
查看次数

如何设置全局容器(C++ 03)?

我想定义一个全局容器(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++定义全局常量,这对此没有帮助.

c++ containers global-variables c++03

4
推荐指数
3
解决办法
2416
查看次数

朋友类可以在C++ 03中有条件地声明吗?

我想仅在某些(编译时)条件为真时才声明友元类.例如:

// 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 .朋友将捕获值并生成波形,但我更愿意仅在需要波形时才拥有朋友,而不是所有时间.

c++ friend c++03

4
推荐指数
1
解决办法
576
查看次数

编译器是否可以跳过对逗号运算符左操作数的评估?

编译器优化有时可以跳过对没有任何后果的某些语句的评估.但是,这也适用于逗号运算符吗?

以下代码在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;

c++ comma

4
推荐指数
1
解决办法
153
查看次数

doxygen markdown 围栏代码块与缩进列表冲突

我观察到,在 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 1Hello world Level 2出现在输出作为代码段,但Hello world Level 3(和~它周围的多个)显示为明文输出。

我犯了什么错误,或者这是一个已知的限制?

markdown doxygen

3
推荐指数
1
解决办法
703
查看次数

blockquote中的doxygen markdown代码块

有没有办法把代码块作为带有doxygen markdown的blockquote?这在引用参考书籍等时非常有用.我尝试了以下内容,但它不会以固定宽度字体打印代码.

> Put the following line in your program:
>
>     printf("Hello, world.");
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像(我使用SO的降价来说明):

将以下行放在您的程序中:

printf("Hello, world.");
Run Code Online (Sandbox Code Playgroud)

markdown doxygen

3
推荐指数
1
解决办法
2375
查看次数

确保派生类构造函数必须调用特定的基类方法

在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 …

c++ inheritance c++03

3
推荐指数
1
解决办法
1915
查看次数

我应该使用static_cast还是INT64_C来便携地分配64位常量?

将64位常量指定为

int64_t foo = 0x1234LL;
Run Code Online (Sandbox Code Playgroud)

是不便携的,因为long long 不一定int64_t.这篇文章哪个初始化程序适合int64_t?讨论了使用INT64_C()<stdint.h>,但是也不可能使用static_castas

int64_t foo = static_cast<int64_t>(0x1234);
Run Code Online (Sandbox Code Playgroud)

我应该选择哪一个,为什么,或者两者都运作良好?

我在互联网上搜索了SO,但没有找到任何static_cast选项被探索的地方.我也做过测试,sizeof()以确认它在简单的情况下工作.

c++ static-cast int64

3
推荐指数
1
解决办法
1797
查看次数

如何在匹配字符序列之前替换字符?

我知道在命令模式下,ct{char}从当前光标位置删除所有文本直到下一个匹配{char},然后可以通过继续键入来替换.

例如,假设文本是:

abcdefgh
Run Code Online (Sandbox Code Playgroud)

并且光标打开b,然后键入ctg将删除bcdef,可以通过继续键入来替换.

但这仅适用于单个匹配字符.是否可以通过匹配字符序列来完成此操作,例如,使用gh代替g,在上面的例子中?

注意:我知道s///可以使用,但这更快,更方便.

vim

3
推荐指数
1
解决办法
93
查看次数

git commit提交unstaged hunks

我曾经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)

git

2
推荐指数
1
解决办法
902
查看次数

整数除法的哪个操作数是static_casted以获得浮点结果是否重要?

要从两个ints的除法中获得浮点结果,我们就是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 …

c++ casting compiler-optimization

2
推荐指数
1
解决办法
50
查看次数

一些git标签在gitk中不可见

在gitk视图中,我注意到一些(但不是全部)git标签缺失.git tag显示这些标签,我也可以通过指定这些标签来结账,以便正确创建标签.我应该尝试了解并调试此问题?

git gitk

1
推荐指数
1
解决办法
2675
查看次数

为什么CHAR_MAX + 1不会导致溢出?

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会导致溢出?

c char

1
推荐指数
1
解决办法
407
查看次数