我正在尝试创建一个宏(C/C++)来动态创建一个函数.基本上我有一个函数,其名称在"MyClassA"部分中有所不同.争论也应该通过宏定义来传递.然后在函数中有一个变量方法调用,例如"methodForClassA",再次使用一组变量的参数.
void Java_somepackage_MyClassA_fixMethod(int arg1, int arg2) {
Toolbox.methodForClassA(arg1, arg2);
}
Run Code Online (Sandbox Code Playgroud)
这种模式有40多种功能.当然我可以手动或用脚本创建它们.但是用宏来做这个也有可能吗?比如像这样的东西(不起作用):
# define MACRO_TEST(classname, methodname, args, argsMethod) void Java_somepackage_##classname_fixMethod(##args) {\
Toolbox.##methodname(##argsMethod);\
}
MACRO_TEST(MyClassA, methodForClassA, args1, args2)
Run Code Online (Sandbox Code Playgroud)
经过一些实验和阅读文档,我只能找到如何创建"动态"函数名称的模式,其中"("跟在动态部分之后:
#define FUNCTION(name, x) int func_##name() { return x;}
FUNCTION(test, 2);
Run Code Online (Sandbox Code Playgroud)
问候,
我有一个Rails 3应用程序,我试图用我的数据库中的每个Nation(少于300个国家)填充javascript变量作为JSON对象.这是我nations.js.erb文件中的相关行:
_this.nations = <%= Nation.all.to_json :only => [:id], :methods => :text %>;
Run Code Online (Sandbox Code Playgroud)
当我在浏览器中调用我的js文件时,/assets/users.js这需要民族文件,该_this.nations变量完全填充.当我尝试进行预编译时,我得到以下内容:
$> rake assets:precompile
$> rake aborted!
uninitialized constant Nation (in nations.js.erb)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:是否可以Nation从js.erb文件中引用模型或任何模型进行预编译?我也尝试使用我的NationsHelper但我的错误只是改为未初始化的常量NationsHelper.
我对RoR很新,所以如果需要我没有提供的相关信息,请问问.
我正在研究简单的模板引导我的javascript工作..它需要非常简单,所以我不使用Handlebars,小胡子或任何其他强大的模板引擎.
我一直在阅读" PRECOMPILE "或" COMPILE " 这个词,以提高性能.但我不确定那究竟是什么意思.在我的工作中,我将模板html缓存在我的对象中,以避免每次都碰到模板html.
这是一个非常简单的功能,主要做以下几点
_template = _template.replace(/\{(.+?)\}/g, function(token, match, number, txt) {
return item[match];
});
Run Code Online (Sandbox Code Playgroud)
item是保存要替换的值的对象.
当有人(车把等)说编译模板时,有人可以告诉我它究竟意味着什么.?
.jspf文件是"Java服务器片段" - 仅适用于其他.jsp文件中的includes()的jsp.
预编译所有.jsp文件非常方便,因为它在构建时而不是运行时暴露语法错误,缺少导入,java代码错误等.在我们查看页面之前,我们都在.jsp中的拼写错误都没有出现.我正在将一个自动任务放入ant中以预编译我的所有JSP文件.(参见http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html#Web_Application_Compilation).
Tomcat的jsp编译器jasper2内置了一个假设,即所有jsp文件都有'.jsp'文件扩展名.这违反了当前建议在适当时使用.jspf文件扩展名.
问题: 如何编写一个ant任务来调用jasper2(又名jspC)来预编译所有.jsp文件,包括.jspf文件?
在我的rails 4项目css使用字体文件.所以他们需要另外预编译.
我通过在config/environments/production.rb中添加以下行来实现这一目标
# Add the fonts path
config.assets.paths << Rails.root.join('vendor', 'assets', 'fonts','fonts')
#
# # Precompile additional assets
config.assets.precompile += %w( *.svg *.eot *.woff *.ttf )
Run Code Online (Sandbox Code Playgroud)
并运行rake资产:在生产中预编译.
但结果如下:
I, [2013-10-10T19:27:51.931963 #16052] INFO -- : Writing /var/lib/openshift/521e19c85004460a8e000107/app-root/runtime/repo/public/assets/fonts/glyphicons-halflings-regular-ab2f6984951c07fd89e6afdefabd93c7.eot
I, [2013-10-10T19:27:51.940615 #16052] INFO -- : Writing /var/lib/openshift/521e19c85004460a8e000107/app-root/runtime/repo/public/assets/fonts/glyphicons-halflings-regular-24dfb40c91db789b8b8faba6886ac1ef.svg
I, [2013-10-10T19:27:51.950685 #16052] INFO -- : Writing /var/lib/openshift/521e19c85004460a8e000107/app-root/runtime/repo/public/assets/fonts/glyphicons-halflings-regular-4b2130768da98222338d1519f9179528.ttf
I, [2013-10-10T19:27:51.983230 #16052] INFO -- : Writing /var/lib/openshift/521e19c85004460a8e000107/app-root/runtime/repo/public/assets/fonts/glyphicons-halflings-regular-7a07f26f72466361ac9671de2d33fd1c.woff
Run Code Online (Sandbox Code Playgroud)
和css文件引用没有此md5指纹的字体文件.
我怎样才能预编译资产,以便在没有md5指纹的情况下生成资产?或者我应该在这种情况下将它们放到public/fonts /文件夹中?
我试图将我们的构建过程从Maven改为Gradle(V 2.9).在Maven中我正在使用JSP的预编译:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jspc-maven-plugin</artifactId>
<version>9.2.7.v20150116</version>
<executions>
<execution>
<phase>package</phase>
<id>jspc</id>
<goals>
<goal>jspc</goal>
</goals>
<configuration>
<excludes>**\/*inc_page_bottom.jsp,**\/*inc_page_top.jsp</excludes>
<includes>**\/*.jsp</includes>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
它工作正常.现在我试图找到一种方法来做同样的gradle.我找到了一些信息/ build.gradle示例,但没有什么工作真的.我目前使用Tomcat 7作为servlet容器,我计划在几周内切换到8.当然,为目标servlet容器编译它们当然是完美的但首先我很乐意预编译它们就像我这样做与maven为/与码头.
我当前build.gradle的一部分,它给了我一个错误:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.bmuschko:gradle-tomcat-plugin:2.2.4'
}
}
apply plugin: 'com.bmuschko.tomcat'
tomcat {
jasper {
validateXml = true
errorOnUseBeanInvalidClassAttribute = false
compilerSourceVM = "1.8"
compilerTargetVM = "1.8"
}
}
task compileJsps(type: JavaCompile, dependsOn: 'clean') {
dependsOn tomcatJasper
group = 'build'
description = 'Translates and compiles JSPs'
classpath = configurations.tomcat + sourceSets.main.output + …Run Code Online (Sandbox Code Playgroud) 背景
我正在使用StackExchange.Precompilation在C#中实现面向方面的编程. 在GitHub上查看我的存储库.
基本思想是客户端代码将能够在成员上放置自定义属性,预编译器将对具有这些属性的任何成员执行语法转换.NonNullAttribute我创建了一个简单的例子.何时NonNullAttribute放置参数p,预编译器将插入
if (Object.Equals(p, null)) throw new ArgumentNullException(nameof(p));
Run Code Online (Sandbox Code Playgroud)
在方法体的开头.
诊断很棒......
我想让错误地使用这些属性变得困难.我发现的最好的方法(除了直观设计)是Diagnostic为了无效或不合逻辑地使用属性创建编译时间.
例如,NonNullAttribute对值类型成员使用没有意义.(即使对于可以为空的值类型,因为如果你想保证它们不是null,那么应该使用非可空类型.)创建Diagnostic一个很好的方法来告知用户这个错误,而不会像这样构建崩溃一个例外.
......但我该如何测试它们?
诊断是突出错误的好方法,但我也想确保我的诊断创建代码没有错误.我希望能够设置一个可以预编译这样的代码示例的单元测试
public class TestClass {
public void ShouldCreateDiagnostic([NonNull] int n) { }
}
Run Code Online (Sandbox Code Playgroud)
并确认已创建正确的诊断(或在某些情况下未创建诊断).
任何熟悉StackExchange.Precompilation的人都可以给我一些指导吗?
解:
@ m0sa给出的答案非常有帮助.实现有很多细节,所以这里的单元测试看起来很像(使用NUnit 3).注意using staticfor SyntaxFactory,这消除了语法树构造中的大量混乱.
using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using NUnit.Framework;
using StackExchange.Precompilation;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
namespace MyPrecompiler.Tests {
[TestFixture]
public class NonNull_CompilationDiagnosticsTest {
[Test]
public void NonNullAttribute_CreatesDiagnosticIfAppliedToValueTypeParameter() …Run Code Online (Sandbox Code Playgroud) @static expr是一种只运行expr一次的方法; 对于某种感觉.
但它有什么意义呢?
是吗:
最常见的用途是用于OS检查:例如
ccall((@static Sys.iswindows() ? :_fopen : :fopen), ...)
我想知道我是否可以使用它来生成基于环境变量的不同代码:特别是JULIA_NUM_THREADS.这个环境变量可以在julia的运行之间改变,但如果它在会话期间发生变化,则不会对它做出任何反应.
官方文档说明了如何通过接口使用预编译头-cc1,如下生成它们:
$ clang -cc1 test.h -emit-pch -o test.h.pch
Run Code Online (Sandbox Code Playgroud)
并使用它们:
$ clang -cc1 -include-pch test.h.pch test.c -o test.s
Run Code Online (Sandbox Code Playgroud)
问题是该-cc1接口的级别太低,开发人员无法通过 CLI 使用。-cc1事实上,常规高级接口最终会通过为其正确操作提供大量参数来调用低级接口,例如适合编译时系统的包含路径。如果没有这些参数,该-cc1界面就无法正常工作:
$ clang++ -cc1 /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h -emit-pch -o std.pch
/usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:33:10: fatal error: 'cassert' file not found
#include <cassert>
^~~~~~~~~
1 error generated.
Run Code Online (Sandbox Code Playgroud)
有没有办法从高层接口使用预编译头,以便开发人员在日常工作中可以方便地利用此功能?
precompile ×10
javascript ×2
jsp ×2
ant ×1
assets ×1
build ×1
c ×1
c# ×1
c++ ×1
clang ×1
gradle ×1
julia ×1
macros ×1
optimization ×1
performance ×1
regex ×1
roslyn ×1
templates ×1
tomcat ×1
tomcat7 ×1
unit-testing ×1