给定一个旧式const char *
指针和一个长度,有没有办法调用std::regex_search()
它而不先将缓冲区的内容复制到std::string
?这是我遇到的问题的一个简单示例:
#include <regex>
int main()
{
const char *text = "123 foobar 456";
const size_t len = strlen(text);
const std::regex rx(" (.+)bar");
std::smatch what;
std::regex_search( text, text+len, what, rx); // <- problematic line
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为第五个带有两个迭代器的std :: regex_search()是我需要的,但是我还没有完全理解如何将指针转换为迭代器.当我尝试编译上面的代码时,我得到了这个:
g++ -std=c++11 test.cpp
test.cpp:11:45: error: no matching function for call to ‘regex_search(const char*&, const char*, std::smatch&, const regex&)’
/usr/include/c++/4.9/bits/regex.h:2131:5: note: template<class _Bi_iter, class _Alloc, class _Ch_type, class _Rx_traits> bool …
Run Code Online (Sandbox Code Playgroud) 我有一些遗留的C++代码(用于使用GNU g ++ 2.95.3进行编译)具有以下声明 std::basic_string<char,string_char_traits<char>,malloc_alloc> x;
头文件是
#include <std/bastring.h>
Run Code Online (Sandbox Code Playgroud)
现在,我迁移到GU G ++ 4.9在那里我得到这个错误:1,std/bastring.h
未发现2.当我改变的#include <std/bastring.h>
因为#include <string>
,我发现了以下错误:
error: 'string_char_traits' was not declared in this scope
std::basic_string<char,string_char_traits<char>,malloc_alloc> x;
error: template argument 2 is invalid
std::basic_string<char,string_char_traits<char>,malloc_alloc> x;
error: expected unqualified-id before ',' token
std::basic_string<char,string_char_traits<char>,malloc_alloc> x;
^
Run Code Online (Sandbox Code Playgroud)
在GNU g ++ 4.9下需要指导/帮助才能使这个可编辑
我在Linux上使用Eclipse CDT Mars.2(和Neon RC)。我的发行版的默认C ++编译器是GCC 5.3.1,但是对于我的某些工作,我使用GCC 4.9.3。我希望有关项目的所有内容都可以使用GCC 4.9.3:工具发现,C ++标准库,包含文件路径,索引器,预处理-全部。
什么是正确的方法?看来Eclipse具有相当拜占庭式的“提供者”和“工具链”配置,我不想进行设置,以后将无法撤消...
注意:
我确实尝试在某些Previous Includes等提供程序设置中替换${COMMAND}
为 /usr/bin/g++-4.9
,这确实导致发现了4.9.3相关的包含文件,但我的索引器并不喜欢这种方式,也不喜欢所有的std :: stuff显示为红色且未解决。然后,我尝试寻找在哪里设置用于索引的编译器版本,但找不到。
我有以下代码:
#include <iostream>
#include <string>
void foo(bool a)
{
std::cout << "bool" << std::endl;
}
void foo(long long int a)
{
std::cout << "long long int" << std::endl;
}
void foo(const std::string& a)
{
std::cout << "string" << std::endl;
}
int main(int argc, char* args[])
{
foo("1");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
执行时我得到这个输出:
bool
Run Code Online (Sandbox Code Playgroud)
我原以为输出:
string
Run Code Online (Sandbox Code Playgroud)
为什么g ++ 4.9隐式将此字符串转换为bool?
我正在尝试安装g ++ 4.9或更高版本,以便在Android上构建mapbox.说明指出我需要g ++ 4.9或更高版本.我找到了以下说明,但它们不起作用.
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install g++-4.9
Run Code Online (Sandbox Code Playgroud)
最后一个命令说:
~ $ sudo apt-get install g++-4.9
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package g++-4.9 is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package 'g++-4.9' has no installation candidate
Run Code Online (Sandbox Code Playgroud)
我也尝试从Synaptic Package Manager获得以下内容:
g++:
Depends: cpp (>=4:4.9-1ubuntu7) but 4:4.8.2-1ubuntu6 is …
Run Code Online (Sandbox Code Playgroud) 保存.cpp
#include "save.h"
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
Save::Save()
{
}
Run Code Online (Sandbox Code Playgroud)
我已经注释了所有函数并从 Save::Save 中删除了内容,但它不会影响错误。
保存.h
#ifndef SAVE_H
#define SAVE_H
#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;
class Save
{
public:
Save();
void vDisplay();
char cDecode();
bool bFileExists(const string& crsFileName);
const char ccTab = 9;
const char ccHelp[5] = "help";
const char ccNo[3] = "no";
const char ccStart[6] = "start";
const char ccQuit[5] = "quit";
const char ccYes[4] = "yes";
};
#endif // SAVE_H
Run Code Online (Sandbox Code Playgroud)
我使用 …
我正在寻找一种简单的方法来将某些g ++(g ++ - 4.9特定的)编译选项本地化到某些代码行或至少是目标函数.我感兴趣一般来说,还特意到-fast-math
,-ffinite-math-only
和-fno-signed-zeros
选项.
我认为可以使用make
实用程序在*.cpp文件级别进行本地化,但我希望有一种方法可以在代码本身中通过#pragma或__attribute__等来启用它.我想这样做不仅可以最大限度地减少对外部文件的依赖性(即不正确的风险makefile
),而且还希望将某些FP行为超本地化为函数内的特定方程.
或者,如果不能通过内联指令本地化FP行为,如果在项目构建中未启用所需的编译器指令(例如makefile
丢失或不适当地修改),我该怎么做才能至少触发编译时错误.
我认为这种内联优化可能是编译器特定的,在这种情况下是g ++,但这是我愿意采取的妥协.
pragma compiler-directives compiler-optimization c++11 g++4.9
在下面给出的示例程序中(来源:http ://www.cplusplus.com/reference/unordered_map/unordered_map/rehash/ )
// unordered_map::rehash
#include <iostream>
#include <string>
#include <unordered_map>
int main ()
{
std::unordered_map<std::string,std::string> mymap;
mymap.rehash(20);
mymap["house"] = "maison";
mymap["apple"] = "pomme";
mymap["tree"] = "arbre";
mymap["book"] = "livre";
mymap["door"] = "porte";
mymap["grapefruit"] = "pamplemousse";
std::cout << "current bucket_count: " << mymap.bucket_count() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出变为:
current bucket_count: 23
Run Code Online (Sandbox Code Playgroud)
为什么桶数变成23?对堆大小有什么影响?堆分配什么时候完成?在存储桶重新散列上还是在实际插入上?动态释放何时完成?何时clear()
使用或erase()
两者都使用?
重要提示:由于最终的ISO C++ 14标准最近才发布,因此GCC的支持是实验性的.不会尝试保持与不反映最终标准的C++ 14功能的实现的向后兼容性.
我找不到官方GCC的定义experimental
.它是否仅适用于非标准功能的向后兼容性,如最后一句所述?或者它是否也表明稳定性或缺乏稳定性?在同一页上的早期句子说
C++ 14特性可作为GCC Subversion存储库主干和GCC 4.8及更高版本中"主线"GCC编译器的一部分提供.
对我而言,这表明稳定性.是这样的吗?特别是,我的问题是关于GCC 4.9,因为这是最早的版本,完全支持C++ 14,根据前面提到的页面.
我有以下代码:
namespace rm {
namespace lib {
class Object {
public:
Object() {printf("Hi\n");}
};
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想用g++ -Wall -Wno-unused -Werror -fPIC -g -Iinclude/ -c -O0 -o object.o object.cpp
和编译一个共享库g++ --shared -o librm.so object.o
.编译工作没有问题,但在检查结果库后nm librm.so | c++filt
,rm::lib::Object::Object()
无处可寻.即使启用-Wextra,GCC也不会发出警告.
G ++版本是(Raspbian 4.9.2-10)4.9.2
出于某种原因,我想使用扩展.cxy
来用作c ++源代码.比如,文件名是abc.cxy
.但是,我的g++
(4.9.2版本)无法编译.我正在编译为:
g++ -o abc.oxy abc.cxy
Run Code Online (Sandbox Code Playgroud)
它抱怨为:g++: warning: conn.cxy: linker input file unused because linking not done
并且,目标文件abc.oxy
没有被制作.然而,如果我有扩展名.cxx
,并编译为:
g++ -o abc.oxy abc.cxx
Run Code Online (Sandbox Code Playgroud)
它正在制作abc.oxy
我不允许使用除以外的扩展名.c, .cpp, .cxx
吗?
我的理解是该功能std::isnan
仅从C++ 11开始提供.此外,除非特别说明,否则g++
使用-std=gnu++98
.
那为什么这会编译?
>> cat test.cpp
#include <cmath>
int main(int argc, char** argv)
{
return std::isnan(0);
}
>> g++ test.cpp
Run Code Online (Sandbox Code Playgroud)
是否有一个标志来取出该功能<cmath>
?
是否可以在不使用表达式的情况下编写一行if-else
语句(即只使用一行;
)?例如以下形式:
?:
if (p == 1) " " else "\n";
潜在目的可能是:
cout << if (p == 1) " " else "\n";
只是好奇这是否可能,不知道是否有任何实际的应用程序.
谢谢
g++4.9 ×13
c++ ×12
c++11 ×6
g++ ×5
gcc ×3
c++14 ×1
eclipse-cdt ×1
eclipse-mars ×1
heap-memory ×1
install ×1
linux ×1
pragma ×1
regex ×1
string ×1