我正在开发一个用于外部化日志字符串的 clang 插件(为了减少嵌入式项目的二进制大小),它需要修改 AST(因此在预处理器之后,编译之前)。
目前,我能够成功匹配我想要替换的节点(使用RecursiveASTVisitor<T>),并正确提取构建替换所需的数据。
在VisitStmt我的访问者的方法中,我正在迭代子节点,当找到匹配项时,我尝试通过迭代器分配将匹配的表达式节点(CallExpr返回 int)替换为新节点( ):IntegerLiteral
*it = clang::IntegerLiteral::Create(context, { 32, value, false }, context.IntTy, old->getLocStart()).
但是,当我尝试使用我的插件编译示例程序时,clang 返回成功状态代码,但没有生成目标文件:
$ clang -std=c11 -Xclang -load -Xclang /tmp/plugin.so -Xclang -plugin -Xclang string-externalise -Xclang -plugin-arg-string-externalise -Xclang -lut-file=lut.txt -c -o example.o example.c
$ echo $?
0
$ stat example.o
stat: cannot stat 'example.o': No such file or directory
Run Code Online (Sandbox Code Playgroud)
如果我尝试转储 AST 以验证我是否已正确修改它,则 clang 也不会给出任何输出。但是如果我禁用我的插件(删除与它相关的 clang 的所有参数),那么我可以转储(原始的、未修改的)AST。
我尝试进行的特定 AST 修改是将对占位符函数(返回 int)的调用替换为整数文字(由插件确定的值)。
例如,将此子CallExpr树替换为IntegerLiteral:
| |-CallExpr …Run Code Online (Sandbox Code Playgroud) 我有一个 Java+Kotlin 应用程序,使用 Gradle 构建。
它的一些低级功能由单独的 C++ 应用程序提供。
这两个应用程序使用协议缓冲区和 gRPC 通过套接字或管道进行通信。
起初,我所希望的一个项目,建立三个(protobuf的生成代码,Java应用程序,C ++应用程序),但是cpp-application和java对某些任务冲突(编译/实施/测试?)。
从那以后,我将其分为三个项目:
/
build.gradle
settings.gradle
cpp-app/
build.gradle
settings.gradle
...
java-app/
build.gradle
settings.gradle
...
protocol/
build.gradle
settings.gradle
build/generated/source/proto/main/java/... <-- Java generated code
build/generated/source/proto/main/cpp/... <-- C++ generated code
...
Run Code Online (Sandbox Code Playgroud)
我的protocol项目成功生成了 C++ 和 Java 实现。
如何让 C++ 和 Java 应用程序项目解析并在其构建中使用这些输出?
我正在尝试在MP4和WEBM fomats中提供HTML5视频.我不能让所有的浏览器都工作:
支持WEBM(Chrome桌面,Firefox桌面)的浏览器播放视频很好.
使用MP4的浏览器无法正常工作(IE,Safari,Android).
WEBM正在服务video/webm.
MP4正在服务video/mp4.
最小的JSFiddle:http://jsfiddle.net/#&togetherjs=5Ql5MmrV4j
IE11:11.0.9600.17126/11.0.9 KB2957689
Error: Unsupported video type of invalid file path
Android浏览器和Chrome Android:
没错,视频就是拒绝启动
收到的文件大小: curl <video URL> | wc -c
实际文件大小: stat -c %s <video file>
服务器指定的文件大小:Content-LengthHTTP标头.
MP4:http://hackology.co.uk/wp-content/uploads/2014/06/hd720-24.mp4
Content-Type: video/mp4
无法在Chrome/IE11/Chrome Android/Android浏览器中播放
是否在VLC中播放
FFMPEG编码参数:
-an -vcodec libx264 -s hd720
-flags +loop+mv4
-cmp 256
-partitions +parti4x4+parti8x8+partp4x4+partp8x8
-subq 6 -trellis 0 -refs 5 -bf 0 -coder 0 …
mp4 google-chrome cross-browser html5-video internet-explorer-11
我已经使用了一段时间的C++,偶尔会让我感到困惑的一件事是我还没有弄清楚如何在C++中使用这个Delphi Factory构造.
我无法弄清楚的关键部分是如何在C++中传递对类类型的引用.在Delphi中,我们有"TClass"类型.这种类型的变量是对某些类的引用.我们可以使用class of MyClass语法来限制类引用可以引用的类来定义新的类引用类型.
注意术语"Delphi类引用"=/="类的C++实例"
对于那些不熟悉Pascal的人来说,变量是声明的variable: type而不是C风格type variable.同样,函数的返回类型出现在参数列表和名称之后.
我已经在下面的例子中浓缩了语法,以减少它的样板,所以对Delphi开发人员道歉,因为它的格式很糟糕.关键部分在评论中描述.
program demo;
{$APPTYPE CONSOLE}
// declarations
type
Base = class
public constructor Create(name: string); virtual;
end;
// Class reference which refers to Base and its descendants
BaseClass = class of Base;
ChildA = class(Base)
public constructor Create(name: string); override;
end;
ChildB = class(Base)
public constructor Create(name: string); override;
end;
// implementation
constructor Base.Create(name: string);
begin
WriteLn('Base says hi to ' + name); …Run Code Online (Sandbox Code Playgroud) 我有一些使用complex [T]复数类型的 C DSP 库。我想从使用std::complex<T>.
阅读完这个 SO 答案和this以及N4296的 \xc2\xa726.4后,我尝试了一项实验:
\n\nextern "C" {\n#include <complex.h>\n// Using _Complex or __complex__ since C\'s "complex" type doesn\'t exist in C++\nvoid cfunc(_Complex float x);\n}\n#include <complex>\n\nvoid test()\n{\n std::complex<float> z;\n cfunc(reinterpret_cast<float[2]>(z));\n}\nRun Code Online (Sandbox Code Playgroud)\n\n并尝试用 来编译它CXXFLAGS="-std=c++11"。我从 GCC 6.3.1 得到以下信息:
error: invalid cast from type \xe2\x80\x98std::complex<float>\xe2\x80\x99 to type \xe2\x80\x98float [2]\xe2\x80\x99\n cfunc(reinterpret_cast<float[2]>(z));\nRun Code Online (Sandbox Code Playgroud)\n\n这是编译器错误还是我误解了什么?complex [T]给定使用类型的 C++代码,如何使用带有参数的 C 函数std::complex<T>?目前,我使用一种肮脏的黑客方法来解决这个问题,但我更喜欢一种干净的方法。
我尝试进行编译,-std=c++14以防万一此功能在某种程度上错过了 C++11(尽管帖子从 C++11 …