标签: c-preprocessor

C中的宏与函数

我总是看到使用宏比使用函数更好的示例和情况.

有人可以通过一个例子向我解释宏与功能相比的缺点吗?

c function c-preprocessor

93
推荐指数
9
解决办法
8万
查看次数

为什么只定义一个宏,如果它还没有定义?

在我们的C代码库中,我看到每个宏都按以下方式定义:

#ifndef BEEPTRIM_PITCH_RATE_DEGPS
#define BEEPTRIM_PITCH_RATE_DEGPS                   0.2f
#endif

#ifndef BEEPTRIM_ROLL_RATE_DEGPS
#define BEEPTRIM_ROLL_RATE_DEGPS                    0.2f
#endif

#ifndef FORCETRIMRELEASE_HOLD_TIME_MS
#define FORCETRIMRELEASE_HOLD_TIME_MS               1000.0f
#endif

#ifndef TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS
#define TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS       50.0f
#endif
Run Code Online (Sandbox Code Playgroud)

这些定义检查的理由是什么,而不仅仅是定义宏?

#define BEEPTRIM_PITCH_RATE_DEGPS                   0.2f
#define BEEPTRIM_ROLL_RATE_DEGPS                    0.2f
#define FORCETRIMRELEASE_HOLD_TIME_MS               1000.0f
#define TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS       50.0f
Run Code Online (Sandbox Code Playgroud)

我无法在网络上的任何地方找到这种做法.

c macros c-preprocessor ifndef

92
推荐指数
5
解决办法
4721
查看次数

C++预处理器__VA_ARGS__参数个数

简单的问题,我无法在网上找到答案.在可变参数宏中,如何查找参数的数量?如果它有解决方案,我可以使用boost预处理器.

如果它有所不同,我试图转换可变数量的宏参数来增强预处理器序列,列表或数组以进行进一步的重新处理.

c c++ c-preprocessor variadic-macros

90
推荐指数
8
解决办法
10万
查看次数

为什么大多数C开发人员使用define而不是const?

在许多程序中,a #define用作与常量相同的目的.例如.

#define FIELD_WIDTH 10
const int fieldWidth = 10;
Run Code Online (Sandbox Code Playgroud)

我通常认为第一种形式优先于另一种,依靠预处理器来处理基本上是应用程序的决定.这个传统有原因吗?

c coding-style c-preprocessor

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

预处理后gcc可以输出C代码吗?

我正在使用一个开源库,它似乎有很多预处理指令来支持除C之外的许多语言.这样我就可以研究库正在做什么了我想看看我在预处理后编译的C代码,更像是我写的东西.

gcc(或Linux中常用的任何其他工具)可以读取这个库,但输出的C代码将预处理转换为任何东西并且人类也可以读取吗?

c preprocessor c-preprocessor preprocessor-directive

90
推荐指数
6
解决办法
10万
查看次数

在C中使用枚举类型的变量作为字符串的简单方法?

这是我想要做的:

typedef enum { ONE, TWO, THREE } Numbers;
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个函数来执行类似于以下的切换案例:

char num_str[10];
int process_numbers_str(Numbers num) {
  switch(num) {
    case ONE:
    case TWO:
    case THREE:
    {
      strcpy(num_str, num); //some way to get the symbolic constant name in here?
    } break;
    default:
      return 0; //no match
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

而不是在每种情况下定义,有没有办法使用枚举变量设置它,就像我在上面尝试做的那样?

c enums c-preprocessor

86
推荐指数
8
解决办法
9万
查看次数

##预处理器运算符和陷阱的应用有哪些应用?

正如我之前的许多问题所述,我正在通过K&R工作,目前正在进入预处理器.其中一个更有意思的事情 - 我之前从未尝试过的任何学习C的尝试 - 是##预处理器操作员.根据K&R的说法:

预处理器运算符## 提供了一种在宏扩展期间连接实际参数的方法.如果替换文本中##的参数与a相邻,则参数将替换为实际参数, ##并删除周围的空白区域,并重新扫描结果.例如,宏paste 连接其两个参数:

#define paste(front, back) front ## back

所以paste(name, 1)创建令牌 name1.

如何以及为什么有人会在现实世界中使用它?它的使用的实际例子是什么,有什么需要考虑的?

c kernighan-and-ritchie stringification c-preprocessor

86
推荐指数
4
解决办法
7万
查看次数

是否有可移植的方式从C预处理器打印消息?

我希望能够做类似的事情

#print "C Preprocessor got here!"
Run Code Online (Sandbox Code Playgroud)

用于调试目的.什么是最好/最便携的方式?

printing c-preprocessor

85
推荐指数
5
解决办法
7万
查看次数

为什么预处理器宏是邪恶的,有什么替代方案?

我一直都这么问,但我从来没有得到过一个非常好的答案; 我认为,在写第一个"Hello World"之前,几乎所有程序员都遇到过"宏不应该使用宏","宏是邪恶的"这样的短语等等,我的问题是:为什么?有了新的C++ 11,这么多年后还有一个真正的选择吗?

简单的部分是关于宏#pragma,特定于平台和特定于编译器,并且大多数时候它们具有严重的缺陷,例如#pragma once在至少两种重要情况下容易出错:不同路径中的相同名称以及一些网络设置和文件系统.

但总的来说,宏的用法和替代品呢?

c++ c-preprocessor c++11

85
推荐指数
3
解决办法
4万
查看次数

这个混淆的C代码声称没有main()运行,但它真正做了什么?

#include <stdio.h>
#define decode(s,t,u,m,p,e,d) m##s##u##t
#define begin decode(a,n,i,m,a,t,e)

int begin()
{
    printf("Ha HA see how it is?? ");
}
Run Code Online (Sandbox Code Playgroud)

这间接打电话main吗?怎么样?

c obfuscation c-preprocessor

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