标签: preprocessor-directive

如何在 C 中编写通用 #define 宏并编写更少的代码

假设我有 2 组 P_A、P_B、P_C 值,如下所示

#define X_P_A  2
#define X_P_B  3
#define X_P_C  4

#define Y_P_A  5
#define Y_P_B  6
#define Y_P_C  7
Run Code Online (Sandbox Code Playgroud)

有 3 种类型的用户:- 一次只需要 X 变体,一次只需要 Y 变体,一次可能需要两者。

例如

#ifdef X
    #define P_A  X_P_A
    #define P_B  X_P_B
    #define P_C  X_P_C
#endif

#ifdef Y
    #define P_A  Y_P_A
    #define P_B  Y_P_B
    #define P_C  Y_P_C
#endif
Run Code Online (Sandbox Code Playgroud)

需要两者的用户将在运行时做出决定并根据需要调用 X_P_<> 或 Y_P_<>。

有没有办法让它更简单,这样我就不必为每个字段编写条件宏

ifdef X
// do something magical does defines all P_<> to X_P_<>
#endif
Run Code Online (Sandbox Code Playgroud)

我知道这听起来很愚蠢。您可能会问为什么不直接在 X 上使用 X_P_<> 变体。我只是想了解是否可能。

我可以改变宏定义的方式。是否可能类似于以下代码:(以下代码的问题是编译失败,因为 …

c c-preprocessor preprocessor-directive

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

在 C# 中使用 #line 指令更改错误或警告的默认行号的原因是什么?

我正在阅读有关 C# 中 #line 指令的 Microsoft 网页https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-line。它解释了 #line 200 指令强制下一行的编号为 200(尽管默认值为 #6),直到 #line default 指令将行编号返回到默认编号。

我的问题是,为什么我们需要更改代码中错误或警告的行号?

class MainClass
{
    static void Main()
    {
#line 200 "Special"
        int i;
        int j;
#line default
        char c;
        float f;
#line hidden // numbering not affected
        string s;
        double d;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译产生以下输出:

Special(200,13): warning CS0168: The variable 'i' is declared but never used
Special(201,13): warning CS0168: The variable 'j' is declared but never used
MainClass.cs(9,14): warning CS0168: The variable 'c' is …
Run Code Online (Sandbox Code Playgroud)

c# preprocessor-directive

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

条件包含:整数常量表达式是否有限?

C11,6.10.1 有条件包含,约束,1(强调):

控制条件包含的表达式应为整数常量表达式

C11,6.6 常量表达式,6(强调):

整数常量表达式117)应具有整数类型,并且只能具有整数常量、枚举常量、字符sizeof常量、结果为整数常量的表达式、_Alignof表达式以及作为强制转换的直接操作数的浮点常量的操作数。

$ cat t333.c
#if (int)1.0
#endif

$ gcc t333.c -std=c11 -pedantic -c
t333.c:1:10: error: missing binary operator before token "1.0"
    1 | #if (int)1.0
Run Code Online (Sandbox Code Playgroud)

这里(int)1.0是整型常量表达式。它具有整数类型并具有操作数,该操作数是浮点常量,是强制转换的立即操作数。但是,每个gcc代码都是无效的。

这意味着 6.10 预处理指令中使用的“整数常量表达式”受到限制 [1]?标准中有明确规定吗?

[1] 例如,“除了sizeof结果为整数常量、_Alignof表达式和作为强制转换的直接操作数的浮点常量的表达式”

c language-lawyer constant-expression c-preprocessor preprocessor-directive

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

预处理程序指令

当我们看到时#include <iostream>,它被称为预处理器指令.

#include --->指令

而且,我认为:

<iostream> --->预处理器

但是,"预处理器"和"指令"是什么意思?

c++ c-preprocessor preprocessor-directive

4
推荐指数
2
解决办法
2229
查看次数

C++中的宏指令和预处理程序指令有什么区别

可能重复:
宏和预处理器之间的差异

我对C++中的宏和预处理器指令有疑问,它们之间有什么区别?好像他们或多或少相同?我试图在互联网上查找,但仍然无法理解,任何人都可以帮忙吗?

c++ macros c-preprocessor preprocessor-directive

4
推荐指数
2
解决办法
3518
查看次数

像#include这样的预处理器指令是否只能放在程序代码的顶部?

我#pragma在函数内部使用了指令而没有错误或警告(特别是#pragma pack()).但是下面的代码显示了警告incompatible implicit declaration of built-in function 'printf'|:

int main(void)
{
    printf("Trial");
}

#include<stdio.h>
Run Code Online (Sandbox Code Playgroud)

此外,这是我所拥有的一本书的摘录.作者对SO的评价很差,特别是对他的慷慨使用void main(),但我觉得没有作者在没有理由的情况下声称以下内容是不是很糟糕:

这些预处理程序指令中的每一个都以#符号开头.指令可以放在程序的任何位置,但通常放在程序的开头,在第一个函数定义之前.

那么你能告诉我是否必须使用一些预处理器指令,比如#include在程序的顶部,而其他类似的指令#pragma可以在程序的任何地方使用?

编辑在OUAH的评论之后我尝试了以下内容,但它没有发出警告,它给出了一大堆错误 .LOL.

int main(void)
{
    #include<stdio.h>
    printf("Trial");
}
Run Code Online (Sandbox Code Playgroud)

c pragma include c-preprocessor preprocessor-directive

4
推荐指数
2
解决办法
2821
查看次数

在构建文档时,如何使doxygen忽略类似函数的宏?

我需要使用doxygen记录一个项目,但是还需要忽略一些宏,我在代码的一小部分中使用这些宏是可读的,因此在文档中出现是没有意义的.

这是一个最小的例子(我主要使用宏来索引一些C风格的2D或3D数组):

#include <cstring>
/*! \file notes.cpp
  \brief A test for macros and doxygen
*/
/// my main function
int main ()
{
   double loc_arr[9][4][4];
   memset (loc_arr, 0.0, 144 * sizeof (double));
#define BLOCK(i) (&(loc_arr[i][0][0]))
   for (int ii = 0; ii < 9; ++ii)
   {
     memset (BLOCK(ii), double(ii), 16 * sizeof (double));
   }
#undef BLOCK
   return 1;
}
Run Code Online (Sandbox Code Playgroud)

当我执行它时,使用以下设置:

ENABLE_PREPROCESSING   = YES
MACRO_EXPANSION        = YES
EXPAND_ONLY_PREDEF     = NO
SEARCH_INCLUDES        = YES
INCLUDE_PATH           =
INCLUDE_FILE_PATTERNS  =
PREDEFINED             = 
EXPAND_AS_DEFINED      = 
SKIP_FUNCTION_MACROS …
Run Code Online (Sandbox Code Playgroud)

doxygen preprocessor-directive

4
推荐指数
2
解决办法
8071
查看次数

括号在#if定义的预处理程序运算符中的含义是什么?

(我正在开发一个SDK,其中我有特定SDK的代码参考,我无法追踪程序的流程.)

是什么

#if defined (AR7x00)
Run Code Online (Sandbox Code Playgroud)

意思?具体来说,这样的预处理器运算符中括号的目的是什么?

c c-preprocessor preprocessor-directive

4
推荐指数
2
解决办法
1811
查看次数

跨平台代码标签宏?

在MSVC和C#中,#pragma region可用于标记代码段.
同样,在GCC/Clang中,#pragma mark可以完成同样的事情.

是否可以定义一个宏,例如CODELABEL(label)哪个宏适用于两个编译器?

基本上,我想避免必须执行以下操作:

#ifdef _WIN32
#pragma region Variables
#else
#pragma mark Variables
#endif
bool MyBool;
int MyInt;

#ifdef _WIN32
#pragma region Methods
#else
#pragma mark Methods
#endif
void MyMethod();
void AnotherMethod();
Run Code Online (Sandbox Code Playgroud)

...而是做这样的事情:

CODELABEL( Variables )
bool MyBool;
int MyInt;
CODELABEL( Functions )
void MyMethod();
void AnotherMethod();
Run Code Online (Sandbox Code Playgroud)

这样的事情可能吗?

c++ pragma region preprocessor-directive

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

如何为GNU ARM汇编程序中的寄存器指定不同的名称?

我有tiva c TM4C123GH6PM,我刚刚安装了一个GNU ARM工具链.我想只在程序集中编程,因为我想为它构建FORTH系统,但是当我使用它时

.equ  W, r2             // working register
Run Code Online (Sandbox Code Playgroud)

这给出了符号r2

add W, IP, #4
main.S(54): error: undefined symbol r2 used as an immediate value
Run Code Online (Sandbox Code Playgroud)

然后我改为:

#define W r2
Run Code Online (Sandbox Code Playgroud)

现在给

add W, IP, #4
main.S(55): error: undefined symbol W used as an immediate value
Run Code Online (Sandbox Code Playgroud)

问题:

  • 是否可以更改名称?
  • 如果没有,我可以使用C前身吗?

assembly arm gnu c-preprocessor preprocessor-directive

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