小编Mar*_*wan的帖子

clang 插件:编译期间修改 AST

我正在开发一个用于外部化日志字符串的 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)

c c++ clang clang-plugin

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

Gradle:同一项目中的 Java/Kotlin、C++、ProtoBuf

我有一个 Java+Kotlin 应用程序,使用 Gradle 构建。

它的一些低级功能由单独的 C++ 应用程序提供。

这两个应用程序使用协议缓冲区和 gRPC 通过套接字或管道进行通信。

起初,我所希望的一个项目,建立三个(protobuf的生成代码,Java应用程序,C ++应用程序),但是cpp-applicationjava对某些任务冲突(编译/实施/测试?)。

从那以后,我将其分为三个项目:

/
 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 应用程序项目解析并在其构建中使用这些输出?

c++ protocol-buffers gradle kotlin

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

HTML5视频:ffmpeg编码的MP4无法在任何浏览器中播放(尽管在VLC中播放)

我正在尝试在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

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

我如何将以下"类引用"机制从Delphi转换为C++ 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)

c++ delphi factory class-reference

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

_Complex 和 std::complex 之间的 C/C++ 互操作

我有一些使用complex [T]复数类型的 C DSP 库。我想从使用std::complex<T>.

\n\n

阅读完这个 SO 答案this以及N4296的 \xc2\xa726.4后,我尝试了一项实验:

\n\n
extern "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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

并尝试用 来编译它CXXFLAGS="-std=c++11"。我从 GCC 6.3.1 得到以下信息:

\n\n
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));\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是编译器错误还是我误解了什么?complex [T]给定使用类型的 C++代码,如何使用带有参数的 C 函数std::complex<T>?目前,我使用一种肮脏的黑客方法来解决这个问题,但我更喜欢一种干净的方法。

\n\n

我尝试进行编译,-std=c++14以防万一此功能在某种程度上错过了 C++11(尽管帖子从 C++11 …

c c++ c++11

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