标签: preprocessor

有谁知道 FMPP 的 Python 等价物?

有谁知道FMPP文本文件预处理器的 Python 等价物?

跟进:我正在阅读文档并查看给出建议的示例。只是为了扩展。我对 FMPP 的使用是读入数据文件 (csv) 并根据该数据使用多个模板以在 html 中创建所有链接到主索引的多页报告。

python preprocessor template-engine freemarker fmpp

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

在 gfortran 中预处理 !DEC$ 指令

我有一个最初针对英特尔编译器的大型 Fortran 代码库。我现在正准备用 gfortran 进行编译。不幸的是,代码中充斥着 Intel 风格的预处理指令,例如:

!DEC$ IF DEFINED (MYDIRECTIVE)
   REAL, DIMENSION(:,:,:), ALLOCATABLE :: my_real_var
!DEC$ ENDIF
Run Code Online (Sandbox Code Playgroud)

从我通过谷歌搜索和 gfortran 文档可以看出,除了 C 风格的预处理之外,没有内部 gfortran 支持,例如:

#if defined MYDIRECTIVE
   REAL, DIMENSION(:,:,:), ALLOCATABLE :: my_real_var
#endif
Run Code Online (Sandbox Code Playgroud)

有没有其他人遇到过这个问题并提出了一个优雅的解决方案?显然,我可以编写一个 shell 脚本,在将代码传递给 gfortran 进行编译之前调用外部预处理器,但这对我来说似乎不是一个很好的解决方案。

有什么想法吗?谢谢大师!

preprocessor fortran gfortran intel-fortran

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

在C编译器中编译过程中的词法和句法分析是什么?

什么是编译过程中的词法和句法分析.预处理是否在词法和句法分析之后发生?

c parsing preprocessor compilation lexical-analysis

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

GNU-M4:删除空行

如何使用M4从输入文件中删除空行(多余的empy行)?

我知道我可以dnl在脚本的每一行末尾追加以禁止换行输出,但是我的意思是空白行不在脚本中,而是在包含的数据文件中(不应放置在其中dnl's)。

我尝试过这样的事情:

define(`
',`')
Run Code Online (Sandbox Code Playgroud)

(不要换新行)但是它没有用。

谢谢。

preprocessor m4

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

如何在同一源文件中有条件地编译特定于版本的Swift(1.2 vs 2.0)代码?

我有一个与我的框架捆绑在一起的Swift演示项目.我想确保演示中的Swift代码与Xcode 6(Swift 1.2)和Xcode 7(Swift 2.0)成功编译,无需用户干预.

由于Swift中只有边缘预处理器支持,如何在编译时确定使用哪个版本的Swift或Xcode来编译代码?

现在,这是重要的细节:

  • 它必须自动工作!
    • 在Xcode 6中打开项目 - >编译Swift 1.2代码.
    • 在Xcode 7中打开项目 - >编译Swift 2.0代码.

没有构建设置或其他需要用户以某种方式指定她正在使用的Swift/Xcode版本的方法.

我一直在想:这是一项微不足道的任务,用Swift怎么可能不可能?

作为一个框架开发人员,这让我感到疯狂,因为Swift项目的成功编译现在完全取决于用户的Xcode版本,我不能要求他们全部"更新到Xcode 6.4",稍后不得不问他们一遍又一遍地"更新到Xcode 7.1".疯了吧!

另一种选择当然是拥有单独的演示项目,管理不同的代码库,每个版本的Swift都有一个.并希望用户知道哪个项目适用于她的Xcode版本.不是一个真正的选择.

遗憾的是,另一种替代方案,即根本不使用任何Swift 2.0的增强功能.有一些语法,类和方法在一个或另一个Swift版本中不起作用,只是因为编译器在较新的Xcode版本中更加挑剔.

xcode preprocessor compilation swift swift2

5
推荐指数
2
解决办法
1348
查看次数

适用于Python的C预处理器宏

我习惯在C中定义宏(而不仅仅是常量)

#define loop(i,a,b) for(i=a; i<b; ++i)
#define long_f(a,b,c) (a*0.123 + a*b*5.6 - 0.235*c + 7.23*c - 5*a*a + 1.5)
Run Code Online (Sandbox Code Playgroud)

有没有一种方法在python中使用预处理而不是函数?

*通过预处理,我的意思是在运行代码之前会替换定义的出现(实际上不是整个代码,而是其余代码,因为既然它是代码的一部分,我想它将在运行时替换所有内容)。

如果有,值得吗?运行时间是否会有显着差异?

python macros preprocessor

5
推荐指数
2
解决办法
6794
查看次数

预处理器和转换器有什么区别?

我正在撰写论文,并没有真正找到任何一个问题的明确答案.
预处理器和转换器(或转换器)之间有什么区别?

在搜索答案时,我已经发现编译器和转换器之间有什么区别.

例如CSS预处理器(sass,less)和JS转换器(coffee script,typescript).它们是一样的吗?我的意思是,他们做同样的事吗?

在某些地方它被称为"JS预处理器",但是当我谷歌那时,我找不到任何有价值的信息.

现在,我在想,预处理器只是将sass转换为CSS,使浏览器更具"可读性".并且转换器编译整个过程,从咖啡脚本语言到javascript语言.

所以我就在这里,转换器只是编译整个事物(这是更大的过程),预处理器只是转换为更"可读"?

或者Sass,例如,就像CSS的不同语言一样,咖啡脚本来自javascript?

先感谢您!

css preprocessor coffeescript transpiler css-preprocessor

5
推荐指数
3
解决办法
1537
查看次数

C++宏创建一个字符串数组

有没有办法用预处理器宏创建std::string(或char*)数组?

像这样的东西:

std::string myStrings[] = {MAGIC_MACRO(a, b, c)};
Run Code Online (Sandbox Code Playgroud)

结果:

std::string myStrings[] = {"a", "b", "c"}
Run Code Online (Sandbox Code Playgroud)

我知道它看起来毫无意义但我需要它在一个更复杂的宏中,它具有可变数量的参数

c++ preprocessor

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

具有空参数的函数式宏的标准行为在##运算符旁边?

请看以下示例:

#define FOO(x) bar x ## baz
FOO( )
Run Code Online (Sandbox Code Playgroud)

在预处理阶段之后,根据ANSI C和C99标准,上述代码的预期输出是多少?

我跑的上面通过gcc -Eclang -E,两者产生的输出等效于以下语句:

bar baz
Run Code Online (Sandbox Code Playgroud)


另外,如果上述预处理输出被认为符合标准,那么这个呢?

#define FOO(x) x ## baz
FOO( )
Run Code Online (Sandbox Code Playgroud)

通过上面的修改,GCC和clang仍然产生相当于以下的输出,而不会发出任何警告或错误(即使有-Wall -Werror标志):

baz
Run Code Online (Sandbox Code Playgroud)


我怀疑上述输出不符合标准的原因是ANSI C 9899:1990标准规定:

6.8.3.3 ##运算符

一个##预处理标记不得在开头或用于宏定义的任一形式的替代列表的末尾出现.

如果在替换列表中,参数紧跟在##预处理标记之前或之后,则该参数将由相应参数的预处理标记序列替换.

好的,从技术上来说,##运算符不是上述两个示例中的替换列表的开头,但x确实扩展到......单个空格?没有?...所以##运算符(至少,据我所知)是将空格pp-token(或无)连接到baz.


此外,标准规定:

对于这两种对象类和函数宏调用,进行复核更多宏名称来替换替换列表之前,一个的每个实例##在替换列表(而不是从一个参数)预处理标记被删除,并且前述预处理标记与以下预处理标记连接.

所以,考虑到我上面给出的第一个例子,为什么不应该正确输出呢?

barbaz
Run Code Online (Sandbox Code Playgroud)


UPDATE

作为旁注,我确实设法让GCC在预处理代码时给出了上面给出的第一个例子的错误,如下所示:

gcc -ansi -pedantic -Wall -Werror -E ex1.c -o -
Run Code Online (Sandbox Code Playgroud)

输出(有错误)是:

foo.c:2:6: error: invoking macro FOO argument 1: …
Run Code Online (Sandbox Code Playgroud)

c preprocessor c-preprocessor

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

C ++停止预处理器宏扩展

这是我的示例代码https://godbolt.org/z/VKgKik

#define delete MyCustomDelete(__FILE__, __LINE__), delete

#define CAT(X,Y) CAT2(X,Y)
#define CAT2(X,Y) X##Y
#define CAT_3(X,Y,Z) CAT(X,CAT(Y,Z))    


class A {
    A() = CAT_3(de,le,te);
};
Run Code Online (Sandbox Code Playgroud)

设置Godbolt示例以显示预处理器输出。目的是在预处理阶段结束时,我希望输出代码为

class A {
    A() = delete;
};
Run Code Online (Sandbox Code Playgroud)

当前显示的是“ ThisShouldNotshowUp”。我以为使用##运算符会阻止预处理器重新扩展,但并没有。

我意识到删除“ #define delete”将解决问题,但我需要在此进行定义。我创建一个与删除名称相同的宏的原因是,我希望能够跟踪新闻和删除,并且如果发生内存泄漏,我可以看到分配给它的代码行。因此,该宏意味着我可以继续在代码中使用关键字delete,并免费填写文件和行号。据我所知,除定义删除宏外,没有其他方法可以实现此功能。这是问题的症结所在。delete宏给了我一个强大的调试工具,但是它删除了一个有用的语言功能供我使用。

c++ preprocessor c++11 preprocessor-directive

5
推荐指数
2
解决办法
243
查看次数