因此,我尝试使用 NAS 基准测试对特定 MPI 实现进行性能测试。所以我去编译 Fortran 代码,但遇到了障碍。每当我输入此命令进行编译时:
gfortran -O0 -Wall -I/home/stephen/trunk/include -I. -c ./TestData/common/timers.f
Run Code Online (Sandbox Code Playgroud)
我收到这些编译器错误:
Warning: mpif.h:2: Illegal pdreprocessor directive
Warning: mpif.h:3: Illegal preprocessor directive
Warning: mpif.h:4: Illegal preprocessor directive
Warning: mpif.h:5: Illegal preprocessor directive
Warning: mpif.h:6: Illegal preprocessor directive
Warning: mpif.h:7: Illegal preprocessor directive
Warning: mpif.h:8: Illegal preprocessor directive
Warning: mpif.h:9: Illegal preprocessor directive
Warning: mpif.h:12: Illegal preprocessor directive
Warning: mpif.h:13: Illegal preprocessor directive
Warning: mpif.h:14: Illegal preprocessor directive
Warning: mpif.h:2: Illegal preprocessor directive
Warning: mpif.h:3: Illegal preprocessor directive …Run Code Online (Sandbox Code Playgroud) 我试图用帕斯卡(freepascal)定义一些东西。与在 C++ 中一样,您可以像这样传递变量定义宏:
#define REP(i,k) for(int i=0; i<k; i++)
Run Code Online (Sandbox Code Playgroud)
你怎么能用帕斯卡做到这一点?
我在第一行添加了{$MACRO ON}命令,因此它可以运行正常的定义,而不会出现类似{$define lala:='hello world'}.
但是当我尝试{define lala(i):=i}该程序时出现错误。
如何在 Pascal 定义中传递变量参数?
在实际测试执行之前,我想调用一些 HTTP API 并从中解析响应,然后再将其处理到我的 SSH 命令采样器。在 Jmeter 中最好的方法是什么?就像 JDBC 请求有一个预处理器一样,为什么 HTTP 请求没有预处理器呢?
如果我定义一个带有参数的宏,如下所示。
#define define_int(a) int a;
Run Code Online (Sandbox Code Playgroud)
并提供一个参数,中间有空格,如下所示
define_int(* a)
Run Code Online (Sandbox Code Playgroud)
并得到输出?
int * a;
Run Code Online (Sandbox Code Playgroud)
有可能的使用
#define ASSIGN(A,B) B=A;
Run Code Online (Sandbox Code Playgroud)
我想直接使用这个宏从函数返回
ASSIGN(A, return B)
Run Code Online (Sandbox Code Playgroud)
这样它就会输出,
return B = A;
Run Code Online (Sandbox Code Playgroud) 以下基于预处理器的标识符到字符串查找表:
#include <iostream>
// included generated file
#define KEY_a valueA
#define KEY_b valueB
///////
#define LOOKUP_(_key_) KEY_ ## _key_
#define QUOTE_(_str_) #_str_
#define EXPAND_AND_QUOTE_(_str_) QUOTE_(_str_)
#define LOOKUP(_key_) EXPAND_AND_QUOTE_(LOOKUP_(_key_))
int main() {
std::cout << LOOKUP(a) << std::endl;
std::cout << LOOKUP(b) << std::endl;
std::cout << LOOKUP(c) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
valueA
valueB
KEY_c
Run Code Online (Sandbox Code Playgroud)
第一个#defines 来自编译前外部脚本生成的#included 标头。
该LOOKUP宏正确处理表中的现有键,并将给定值替换为字符串文字。
但对于不存在的键,它会将键替换为字符串文字。
有没有办法让它用给定的常量替换不存在的键,而不会导致编译时错误,并且全部在预处理阶段进行?
例如,LOOKUP(c)和LOOKUP(whatever)应该全部替换为"undefined", 而不出现c或whatever出现在包含的生成文件中。
键的名称不应输出到编译的二进制文件中,因此理想情况下编译器永远不会看到它们。
我正在尝试使用预处理器库来清理存储在 Pandas 数据框中的文本。我已经安装了最新版本(https://pypi.org/project/tweet-preprocessor/),但收到以下错误消息:
import preprocessor as p
#forming a separate feature for cleaned tweets
for i,v in enumerate(df['text']):
df.loc[v,'text'] = p.clean(i)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-183-94e08e1aff33> in <module>
1 #forming a separate feature for cleaned tweets
2 for i,v in enumerate(df['text']):
----> 3 df.loc[v,'text'] = p.clean(i)
AttributeError: module 'preprocessor' has no attribute 'clean'
Run Code Online (Sandbox Code Playgroud) 在各种项目中,我时不时地会遇到 C# 项目中无法使用泛型解决的元编程情况,并且会受益于更强大的元编程工具。我通常采用的解决方案是通过反射解决问题、使用 C++/cli,或者引入自定义 xml/xslt 编译器步骤。
这是否反映了 C# 社区普遍采用的方法,或者是否存在我不知道的有价值的方法,例如广泛使用的第 3 方预处理器?
我不是在要求产品推荐,而是在询问针对这个常见问题的既定通用解决方案。“不,没有”可能是有效且正确的答案。
我想我会很聪明,围绕禁用/启用中断编写一个小的预处理器包装器,如下所示:
#define WITH_INTERRUPTS_DISABLED(_body) \
do { \
uint32_t primask = DisableGlobalIRQ(); \
do { \
_body \
} while (0); \
EnableGlobalIRQ(primask); \
} while (0)
Run Code Online (Sandbox Code Playgroud)
GCC 预处理器,当出现此源时:
WITH_INTERRUPTS_DISABLED(
i += 2;
quux();
);
Run Code Online (Sandbox Code Playgroud)
...生成此输出(重新格式化以提高可读性):
do {
uint32_t primask = DisableGlobalIRQ();
do {
i += 2;
quux();
} while (0);
EnableGlobalIRQ(primask);
} while (0)
Run Code Online (Sandbox Code Playgroud)
根据Godbolt 先生的说法,所有 GCC 变体的行为都如上,省略了结束分号。同时,所有clang变体的输出都包含分号。
有没有办法说服 GCC 包含分号?
我有一些这样的逻辑:
#define MYVAR
...
#if MYVAR
[Attribute1]
#else
[Attribute2]
#endif
Run Code Online (Sandbox Code Playgroud)
我希望能够根据环境变量切换应用于方法的属性,就像MYVAR设置环境变量一样,然后实际定义符号“MYVAR”,反之亦然。
老实说,我不知道这是否可能。如果没有任何想法如何克服这个问题?我当然可以将其添加到方法本身中 - env. 变量检查,但由于正在执行反射,我需要属性。我可以创建自定义MyAttrbute(int mode),但无法在其构造函数中添加逻辑来提取环境。变量,因为它必须是常量表达式。
可能的解决方案:
就像第一条评论所暗示的那样,我可以阅读环境。自定义属性中的变量。仍然会有一些令人讨厌的反思要做。
因为我使用 dotnet 命令在 Linux 上工作,所以我实际上可以将构建命令与 pre-step 命令捆绑在一起,并在文件顶部sed添加一个虚拟占位符,并将其替换为空字符串或基于 env 的完整字符串。变量。这里没有反射,但不是很优雅。{{define_myvar}}.cs
假设我有这个预处理器检查:
#if(-6 & 5)
#error "No 2's complement signed int"
#endif
Run Code Online (Sandbox Code Playgroud)
如果我从二进制补码机交叉编译到二进制补码机,会发生什么情况。编译器会使用目标机器的算术,还是编译机器的算术?
谢谢
preprocessor ×10
c ×2
c# ×2
c++ ×2
macros ×2
.net ×1
attributes ×1
clang ×1
compilation ×1
directive ×1
fortran ×1
freepascal ×1
gcc ×1
gfortran ×1
http ×1
jmeter ×1
pascal ×1
python ×1