标签: preprocessor

如何在 C 中连接两个字符串宏?

我正在尝试为我的程序实现 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)

c macros preprocessor concatenation

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

类别编码器中的证据权重实际上是如何计算的?

我正在尝试手动计算 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)

python preprocessor encoder machine-learning data-science

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

C/C++:预处理器指令应如何处理宏参数列表?

C 和 C++ 标准都指定了以下内容:

\n
\n

16.3.1 参数替换 (C++11)

\n

6.10.3.1 参数替换 (C11)

\n

在识别出调用类似函数的宏的参数后,将进行参数替换。替换列表中的参数,除非前面有 # 或 ## 预处理标记或后面有 ## 预处理标记(见下文),否则在其中包含的所有宏都已展开后将被相应的参数替换。在被替换之前,每个参数\xe2\x80\x99s预处理标记被完全宏替换,就好像它们形成了预处理文件的其余部分一样;没有其他可用的预处理标记。

\n
\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)

c c++ standards preprocessor c-preprocessor

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

gdb 可以打印扩展的预处理器/宏结果吗?

例如:

#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 中以某种方式打印吗?

在宏可能非常复杂的真实示例中,我不想浪费时间做预处理器的工作。

preprocessor gdb debug-information c-preprocessor

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

使用 %assign 而不是 %define 有什么意义吗?

在我看来,%define定义单行宏的指令只是%assign具有附加功能(例如获取参数的能力)的指令。如果是这样的话,使用还有什么意义呢%assign?另外,关于%xdefineequ呢?

这里的答案对我来说并不清楚,因为它太短了。我也阅读了文档,但我没有看到使用%assign.

macros assembly preprocessor nasm

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

符号常数:它们是如何存储的以及它们的类型是什么?

C++允许您使用#define预处理程序指令来定义编译器在编译之前将替换的符号常量.我的问题是,编译器通常如何在内部存储它们并且它们是否具有数据类型?

compiler-construction preprocessor

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

AspectJ编译时编织-获取输出源代码?

有没有一种方法可以通过AspectJ编译来获取源文件?因此,ajc不会获取字节码,而是用作生成可以用javac编译的Java源的预处理器?

java preprocessor aspectj compile-time-weaving

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

C预处理器变量串联"."

我知道多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因为这是我想在不同的变量名称上多次调用的东西.

c macros preprocessor

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

LHS中的MACRO或R = =((= =)运算符在if中的if()条件?

这是我在分析大量代码库时的观察结果.这是示例代码

/*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)

这是正确的,因为有时可能会错误地使用= …

c preprocessor if-statement operators

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

如何在运行时有效地排除代码块

为了在编译期间从模型中排除代码块,我将预处理器用作:

#ifdef setting1
do something
#endif //setting1
Run Code Online (Sandbox Code Playgroud)

有时我打算在编译过程中保留一段代码,但在运行时将其排除在外。if为此目的,有没有比声明更好的方法了?

c++ preprocessor

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