所以我想使用llvm::Twine
字符串块类。
我有以下样本:
#include <llvm/ADT/Twine.h>
#include <iostream>
int main()
{
llvm::Twine twine1 = llvm::Twine("aaaa") + "bbbb" + "cccc" + "dddd";
llvm::Twine twine2 = llvm::Twine(twine1) + "dddd" + "eeee";
std::cout << twine1.str() << std::endl;
std::cout << twine2.str() << std::endl;
return 0;
}
它与clang++
合并-O3
合并g++
合并-O0
合并,g++
合并-O3
。我尝试使用3.4-3.9中的不同版本的clang库,并尝试使用g++ 4.8.4
,g++ 4.8.5
和mingw-5.3.0
。
您需要llvm库并将代码与-lLLVMSupport -lLLVMCore
以及llvm-config --ldflags
答案 0 :(得分:5)
Twine不能直接使用,也不应存储 实现依赖于存储指向临时指针的能力 堆栈对象,可以在语句结尾处解除分配。 Twines只能在参数中被接受为const引用, 当API希望接受可能连接的字符串时。
换句话说,Twine对象不拥有它的部分,所以它们在语句结束时被销毁。
正确的用法是:
#include <llvm/ADT/Twine.h>
#include <iostream>
void bar(const llvm::Twine& twine1, const llvm::Twine2& twine2){
std::cout << twine1.str() << std::endl;
std::cout << twine2.str() << std::endl;
}
void foo(const llvm::Twine& twine1){
bar(twine1, twine1 + "dddd" + "eeee");
}
int main()
{
foo(llvm::Twine("aaaa") + "bbbb" + "cccc" + "dddd");
return 0;
}
答案 1 :(得分:-1)
看起来您正在尝试使用gcc
编译一些代码,并将其与使用不同编译器构建的库链接;即llvm
。
不同的编译器通常会使用不同的internal ABI。通常,由一个C ++编译器编译的代码不能与构建不同编译器的代码链接,除非有明确的ABI兼容性保证。 TMK,gcc和llvm之间没有。即使实际链接可能成功,结果也不会有定义的行为。
事实上,由一个版本的gcc构建的代码通常不能与使用不同版本的gcc构建的代码链接(许多版本的gcc确实具有某些ABI兼容性保证,但不能与其他所有版本的gcc一起使用)。 / p>