我正在尝试为我的程序实现 VERSION 宏,该宏将在某些情况下进行更改。
宏 VERSION 通过 Makefile 定义(git 信息放在那里)并且是一个字符串。现在我有一组#define'd 开关,我希望 VERSION 能够反映其中哪些开关处于打开状态。现在看起来如下(main.h):
#define COMPLEX_DEPOSITION // This is switch. later in code it is used in #ifdef...#endif construction.
#ifdef COMPLEX_DEPOSITION
#define CD "_COMP_DEP" // this is the string I want to put in the end of VERSION
#define VERSION_ VERSION CD
#undef VERSION // this is to suppress 'macro redefinition' warning
#define VERSION VERSION_
#undef VERSION_
#endif
Run Code Online (Sandbox Code Playgroud)
嗯,我遇到了很多错误,其中大部分让我认为 C 预处理器以随机顺序处理文件中的行:(
后来我有一个更复杂的事情,旨在使VERSION -> VERSION_WLT_GAP_2
#define COMPLEX_DEPOSITION // This is switch. later …Run Code Online (Sandbox Code Playgroud) 我正在尝试手动计算 WoE,但无法获得与 Category_encoders WOEEncoder 计算的结果相同的结果。这是我想要计算分数的数据框:
df = pd.DataFrame({'cat': ['a', 'b', 'a', 'b', 'a', 'a', 'b', 'c', 'c'], 'target': [1, 0, 0, 1, 0, 0, 1, 1, 0]})
Run Code Online (Sandbox Code Playgroud)
这是我用来计算 WoE 分数的代码
woe = WOEEncoder(cols=['cat'], random_state=42)
X = df['cat']
y = df.target
encoded_df = woe.fit_transform(X, y)
Run Code Online (Sandbox Code Playgroud)
相同的结果是:
0 -0.538997
1 0.559616
2 -0.538997
3 0.559616
4 -0.538997
5 -0.538997
6 0.559616
7 0.154151
8 0.154151
Run Code Online (Sandbox Code Playgroud)
因此,'a' 被编码为 -0.538997 'b' 被编码为 0.559616 'c' 被编码为 0.154151
当我手工计算分数时,它们是不同的,我取
ln(% of non events / % of …Run Code Online (Sandbox Code Playgroud) C 和 C++ 标准都指定了以下内容:
\n\n\n16.3.1 参数替换 (C++11)
\n6.10.3.1 参数替换 (C11)
\n在识别出调用类似函数的宏的参数后,将进行参数替换。替换列表中的参数,除非前面有 # 或 ## 预处理标记或后面有 ## 预处理标记(见下文),否则在其中包含的所有宏都已展开后将被相应的参数替换。在被替换之前,每个参数\xe2\x80\x99s预处理标记被完全宏替换,就好像它们形成了预处理文件的其余部分一样;没有其他可用的预处理标记。
\n
人们可以将本段解释为标准要求:
\n(1) 首先识别宏参数(以逗号分隔),然后分别展开每个参数中包含的所有宏,
\n或者
\n(2) 展开参数列表中包含的所有宏,然后识别每个参数。
\n为了说明这一点,让我们考虑以下示例代码:
\n#define CONDITION (0)\n\n#if (CONDITION > 0)\n#define FunctionAlias(par_a, par_b, par_opt, par_c) \\\n FunctionName(par_a, par_b, par_opt, par_c)\n#else\n#define FunctionAlias(par_a, par_b, par_c) \\\n FunctionName(par_a, par_b, par_c)\n#endif\n\nint global_a, global_b, global_c;\n#if (CONDITION > 0)\nint global_opt;\n#endif\n\nvoid FunctionName(int a, int b, int c)\n{\n}\n \nvoid AnotherFunction()\n{\n FunctionAlias(\n global_a,\n global_b,\n #if (CONDITION > 0)\n global_opt,\n …Run Code Online (Sandbox Code Playgroud) 例如:
#include <stdlib.h>
#define A 20
#define B 22
#define C (A+B)
int main()
{
srand(time(0));
int i = (rand()&1) + C;
return i;
}
Run Code Online (Sandbox Code Playgroud)
在gdb中,
(gdb) print C
No symbol "C" in current context.
Run Code Online (Sandbox Code Playgroud)
我怎么知道C是什么?可以gdb告诉我吗?(我添加的rand()所以我们不能轻易推断出它是什么)
预处理器会将 C 替换为(20+22). 这个值可以在 debuginfo 中以某种方式打印吗?
在宏可能非常复杂的真实示例中,我不想浪费时间做预处理器的工作。
在我看来,%define定义单行宏的指令只是%assign具有附加功能(例如获取参数的能力)的指令。如果是这样的话,使用还有什么意义呢%assign?另外,关于%xdefine和equ呢?
这里的答案对我来说并不清楚,因为它太短了。我也阅读了文档,但我没有看到使用%assign.
C++允许您使用#define预处理程序指令来定义编译器在编译之前将替换的符号常量.我的问题是,编译器通常如何在内部存储它们并且它们是否具有数据类型?
有没有一种方法可以通过AspectJ编译来获取源文件?因此,ajc不会获取字节码,而是用作生成可以用javac编译的Java源的预处理器?
我知道多Q&作为[的1,2 ]是紧密联系在这个问题上,我一直试图实现他们的解决方案,但事实证明,我需要使用.在我的连接中似乎给我带来了麻烦.
这就是我要的:
#include <stdio.h>
#define PROPERTY .value1
#define MAKE_PROP(var) var##PROPERTY
typedef struct {
int value1;
int value2;
} Node;
int main(void) {
Node node;
node.value1 = 1;
node.value2 = 2;
// MAKE_PROP(node) should evaluate to "node.value1".
printf("%d", MAKE_PROP(node));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然而它给了我各种各样的错误.如果我尝试[ 2 ]中的PASTER-EVALUATE想法,那么它会告诉我"粘贴"."和"PROPERTY"没有给出有效的预处理令牌".
谁知道如何完成我需要的东西?它必须保持一般,并且我可以使用,var因为这是我想在不同的变量名称上多次调用的东西.
这是我在分析大量代码库时的观察结果.这是示例代码
/*comparing received RAT(it may be 2G/3G/4G) Type from ip packet with numeric value */
if(pBearer.data.recv.rat_recv == 1)
{
rrc.send_conn.rat_type = MY_GERAN; /* setting RAT as GERAN(enumerated value) i.e 2G */
/* further processing of packet */
}
Run Code Online (Sandbox Code Playgroud)
这是代码评论员的评论
根据编码标准,我们应该使用MACRO而不是数值作为我们可能使用的时间
=而不是==.
它得到了解决
if(pBearer.data.recv.rat_recv == DB_RAT_GERAN) /* DB_RAT_GERAN is a macro defined somewhere in header file */
{
rrc.send_conn.rat_type = MY_GERAN; /* setting RAT as GERAN i.e 2G */
/* further processing of packet */
}
Run Code Online (Sandbox Code Playgroud)
这是正确的,因为有时可能会错误地使用= …
为了在编译期间从模型中排除代码块,我将预处理器用作:
#ifdef setting1
do something
#endif //setting1
Run Code Online (Sandbox Code Playgroud)
有时我打算在编译过程中保留一段代码,但在运行时将其排除在外。if为此目的,有没有比声明更好的方法了?
preprocessor ×10
c ×4
macros ×3
c++ ×2
aspectj ×1
assembly ×1
data-science ×1
encoder ×1
gdb ×1
if-statement ×1
java ×1
nasm ×1
operators ×1
python ×1
standards ×1