小编J.N*_*.N.的帖子

在G ++ 4.7中的内联函数中定义时未找到Lambda

我在头文件中定义了以下函数(该库是目标只是头文件的一部分):

typedef bool (*FieldComparer)(const std::string&, const std::string&);

inline FieldComparer
GetComparer(const std::string& query, string& separator)
{
    if (query.find('=') != std::string::npos) {
        separator = "=";
        return [](const string& s1, const string& s2) { return s1 == s2; };
    }
    else if (query.find('^') != string::npos) {
        separator = "^";
        return [](const string& s1, const string& s2) { return boost::starts_with(s1, s2); };
    }
    else if (query.find('*') != string::npos) {
        separator = "*";
        return [](const string& s1, const string& s2) { return boost::contains(s1, s2); }; …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 gcc4.7

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

Eclipse CDT将"普通文件夹"转换为"源文件夹",反之亦然

因为我不习惯Eclipse,所以我的项目的子文件夹是"源"和"普通"文件夹.这不是什么大问题,因为那些是Makefile项目,但让我的文件夹没有按字母顺序排列(首先显示源文件夹)让我感到困扰.

我想将我的"普通"文件夹转换为"源"文件夹但我在所述文件夹上的右键菜单中找不到任何相关内容,也没有在"属性"窗口中找到相关内容.

有没有办法转换不涉及.cproject手动编辑文件的文件夹类型?如果没有,我可以只编辑sourceEntries标签(它似乎到目前为止工作)?

我正在使用CDT 8.0.2.

c++ eclipse-cdt

11
推荐指数
2
解决办法
8389
查看次数

如何记录makefile?

有没有办法在Makefile中编写"标准"注释,以便以后将它们提供给类似Doxygen的程序,以便输出一个好的(HTML或man)文档?我想在某个地方清楚地概述我的主要目标,但没有什么太花哨的.

makefile documentation-generation

8
推荐指数
4
解决办法
2240
查看次数

如何检测窗口是否已最大化?

有谁知道窗口最大化时发送的 WM_MESSAGE (通过在标题栏中按下最大化按钮,或通过双击标题栏?)

是否有关于按下最大化按钮的 Windows 消息?

Win32/C++,谢谢。

c++ winapi visual-c++

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

c ++:根据预定义的元素索引选择std :: vector的子集

我正在寻找一种有效的方法来修剪或复制现有std :: vector的子集.符合子集/保留条件的元素的标准是它们的索引包含在单独的预定义std :: vector中.

e.g std::vector<String> Test = { "A", "B", "C", "D", "E"}

std::vector<int> SelectionV = {1,2,5}

Result = {"A", "B", "E"}
Run Code Online (Sandbox Code Playgroud)

我将在一个非常大的向量上执行此操作,并且可能定期执行此操作,因此我正在寻找尽可能有效的方法.

我也在考虑另一种选择,但又不确定一种有效的方法是......

当对象Test被填充时(在我的情况下它是第三方定义的对象),它是使用迭代器进行单次传递的结果(不能直接访问元素).我想知道是否可以只添加出现在SelectionV中定义的计数中的Test向量元素

例如

int count = 0

for (Iterator.begin, Iterator.end(), Iterator++) {
    if (count is a number contained in selectionV)
        add to Test
}
Run Code Online (Sandbox Code Playgroud)

但我认为这会导致每次迭代都会通过selectionV,这比简单地添加所有元素并稍后选择子集要低得多.

任何帮助非常感谢.

c++ performance sample vector subset

5
推荐指数
2
解决办法
3716
查看次数

输入punning,char []和解除引用

我有一个旨在存储用户定义数据(即从插件)的结构.它具有这样的char[]具有给定最大尺寸的存储该数据.

struct A
{
    // other members omitted
    // data meant to be type punned, only contains PODs
    char data[256];
};
Run Code Online (Sandbox Code Playgroud)

然后是一个示例用户结构,它具有一个静态函数来自己投射A.

struct B
{
    int i;
    double d;

    static B& FromA_ref(A& a)
    {
        // static_assert that sizeof(B) < sizeof(A::data)
        return * reinterpret_cast<B*>(a.data);
    }
};
Run Code Online (Sandbox Code Playgroud)

我编译g++ -O3 -std=c++0x -Wall -o test test.cpp(GCC 4.6.1).

这会触发dereferencing type-punned pointer will break strict-aliasing rules警告.我认为这样可以,因为我使用了一个char[]存储器,我认为它将遵循相同的规则char*.我觉得很奇怪,事实并非如此.不是吗?好吧,......我现在无法改变它,所以让我们继续吧.

现在让我们考虑以下方法:

struct B
{
    ....
    static B* FromA_ptr(A& …
Run Code Online (Sandbox Code Playgroud)

c++ type-punning

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

c++ 类型特征表示“可轻易移动” - 示例

我将“微不足道的可移动”定义为

调用移动构造函数(或移动赋值运算符)相当于将字节 memcpy 到新目标,而不是对移出的对象调用析构函数。

例如,如果您知道此属性成立,则可以使用它realloc来调整 std::vector 或内存池的大小。

失败的类型通常会有指向其内容的指针,需要由移动构造函数/赋值运算符更新。

我可以找到的标准中没有这样的类型特征。我想知道这是否已经有一个(更好的)名称,是否已经被讨论过以及是否有一些库利用了这样的特性。

编辑1:

从前几条评论来看,std::is_trivially_move_constructible并不std::is_trivially_move_assignable等同于我正在寻找的内容。我相信他们会给出true包含指向自身的指针的类型,因为读取您自己的成员似乎属于“琐碎”操作。

编辑2:

当正确实现时,指向自身的类型将不再是 trivially_move_constructible 或 move_assignable,因为 move ctor / move 赋值运算符不再是微不足道的。不过,我们应该可以说,只要我们不调用它的析构函数,unique_ptr 就可以安全地复制到新位置。

c++ type-traits move-semantics

5
推荐指数
2
解决办法
1906
查看次数

AVX2 禁用 SSE 指令集的 gcc 目标

我们有一个要使用 AVX2 编译的翻译单元(仅此一个):\n它告诉 GCC\xc2\xa0upfront,文件中的第一行:

\n\n
#pragma GCC target "arch=core-avx2,tune=core-avx2"\n
Run Code Online (Sandbox Code Playgroud)\n\n

这曾经适用于 GCC 4.8 和 4.9,但从 6 开始(也尝试过 7 和 8),我们收到此警告(我们将其视为错误):

\n\n
error: SSE instruction set disabled, using 387 arithmetics\n
Run Code Online (Sandbox Code Playgroud)\n\n

在第一个返回浮点数的函数上。我尝试像这样启用 SSE 4.2 (以及 avx 和 avx2)

\n\n
#pragma GCC target "sse4.2,arch=core-avx2,tune=core-avx2"\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这还不够,错误仍然存​​在。

\n\n

编辑:

\n\n

相关编译器标志,我们针对大多数内容以 AVX 为目标:

\n\n
-mfpmath=sse,387 -march=corei7-avx -mtune=corei7-avx\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑2:最小样本:

\n\n
#pragma GCC target "arch=core-avx2,tune=core-avx2"\n\n#include <immintrin.h>\n#include <math.h>\n\nstatic inline float\nlg1pf( float x ) {\n    return log1pf(x)*1.44269504088896338700465f;\n}\n\nint main()\n{\n  log1pf(2.0f);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样编译:

\n\n
gcc -o test test.c …
Run Code Online (Sandbox Code Playgroud)

c gcc avx2

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

GCC -rdynamic不能使用静态库

为什么-rdynamic不导出.a文件中的符号,而是导出.o文件中的符号?

我在.so文件中有一个应用程序和一个插件.主应用程序使用一系列目标文件和一个静态库链接,如下所示:

CXXFLAGS =      $(CXXFLAGS_COMMON) -rdynamic
STATICLIBS =    ../Utilities/Utilities.a
...

all:
    $(CXX) $(CXXFLAGS) -o $(SAMPLE) main.o $(STATICLIBS) $(SHAREDLIBS) $(INCLUDES)
Run Code Online (Sandbox Code Playgroud)

(CXX是Ubunut上的g ++ 4.5.2,我主要使用-std = c ++ Ox进行编译)

在这种情况下,不导出Utilities.a中的符号(即"objdump -t a.out | grep symbol"为空).

如果我使用"ar x"来仅仅使用.o来提取.a和.链接中的.o文件,那么这些符号将被插件导出并找到(如果你想知道的话加载了dlopen).

我尝试过使用-Wl,-export-dynamic但没有成功.

如上所述,我确实有一个解决方法,但我仍然希望了解我所缺少的内容.提前致谢 !

gcc dynamic-linking static-libraries

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

使用字符串临时构建istringstream

在尝试我的代码回答另一个问题时,我发现以下内容没有编译

#include <iostream>
#include <cstring>
#include <sstream>
#include <string>

using namespace std;

// (main omitted)
const char * coin = "3D";
istringstream ss(string(s));
int i;
ss >> hex >> i;              <--- error here
cout << (char) i << endl;
Run Code Online (Sandbox Code Playgroud)

它因以下错误而失败:

test.cpp:15:11: error: invalid operands of types ‘std::istringstream(std::string) {aka std::basic_istringstream<char>(std::basic_string<char>)}’ and ‘std::ios_base&(std::ios_base&)’ to binary ‘operator>>’
Run Code Online (Sandbox Code Playgroud)

以下编译并正确运行:

const char* coin = "3D";
string s(coin);
istringstream ss(s); // or directly istringstream ss("3D")
int i;
ss >> hex >> i;              
cout << (char) i …
Run Code Online (Sandbox Code Playgroud)

c++ iostream stl

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

联盟初始化

管理联合的未初始化字节的规则是什么?(假设有些是初始化的)

下面是一个32字节的并集,我通过第一个成员初始化前16个字节.似乎剩余的字节是零初始化的.这对我的用例很有用,但我想知道这背后的规则是什么 - 我在期待垃圾.

#include <cstdint>
#include <iostream>

using namespace std;

union Blah {
   struct {
      int64_t a;
      int64_t b;
   };
   int64_t c[4];
}

int main()
{
   Blah b = {{ 1, 2 }}; // initialize first member, so only the first 16 bytes.

   // prints 1, 2, 0, 0 -- not 1, 2, <garbage>, <garbage>
   cout << b.c[0] << ", " << b.c[1] << ", " << b.c[2] << ", " << b.c[3] << '\n';

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我已经编译了GCC …

c++ initialization unions

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

在C++中复制数组的麻烦

我在C++中复制一个数组,这里是代码:

int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *source = arr1;
size_t sz = sizeof(arr1) / sizeof(*arr1); // number of elements
int *dest = new int[sz];                // uninitialized elements
while (source != arr1 + sz)
    *dest++ = *source++; //  copy element and increment pointers

int *p = dest;
while (p != dest + sz) {
    cout << *p++ << endl;
}
Run Code Online (Sandbox Code Playgroud)

运行上述代码后,我得到了:

714124054
51734
9647968
9639960
0
0
0
0
0 …
Run Code Online (Sandbox Code Playgroud)

c++

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

'else'的if/else在执行C#时不执行

我正在用C#设计一个ATM系统,对于登录功能,我使用一个SQL服务器数据库来比较输入的卡号和密码与数据库中的密码.当输入正确的卡号和密码时,一切正常,但是当输入的值不正确时,根本没有任何事情发生,我现在已经试图解决它.有没有人对它可能有什么想法?甚至我的大学讲师都不知道!

//Select all fields from the table 'ATMCards' using the connection previously created and use the SqlDataReader to read the values
Run Code Online (Sandbox Code Playgroud)

为了简化它我只是将messagebox.show放在else中,因为我想要做的就是至少让它触发!

SqlCommand cmd = new SqlCommand("SELECT * FROM [ATMCards] WHERE (cardNumber = @cardNumber) AND (PIN = @PIN)", cn);
cmd.Parameters.AddWithValue("@cardNumber", cboxSimCard.Text);
cmd.Parameters.AddWithValue("@PIN", txtboxPIN.Text);

cmd.Connection = cn;
SqlDataReader r = null;
r = cmd.ExecuteReader();

//While the reader is in execution:
while (r.Read())
{
    //ADD IF NOT CONFISCATED DO THIS:
    if (((Boolean)(r["confiscated"]) == notConfiscated))
    {
        string cNum =  r["cardNumber"].ToString();
        string pin = …
Run Code Online (Sandbox Code Playgroud)

c# sql

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