标签: c-preprocessor

我可以测试预处理器指令的值吗?

我有一个未设置的预处理器指令,因此我无法更改它,它要么是 true 要么是 false。

通常我会这样做:

#ifdef DIRECTIVE
// code
#endif
Run Code Online (Sandbox Code Playgroud)

但这将始终运行,因为DIRECTIVE始终已定义。

有没有一种方法可以基本上相当于:

#if DIRECTIVE
#endif
Run Code Online (Sandbox Code Playgroud)

我想我可以做

bool DirectiveValue = DIRECTIVE;
if (DirectiveValue){

}
Run Code Online (Sandbox Code Playgroud)

但我真的希望第二个代码块能够以某种方式实现。

感谢您的任何见解!

c++ preprocessor c-preprocessor

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

将定义嵌入到字符串中

我有一个预处理器定义,它应该确定数组的大小。
该常量还应该传递给 HLSL 着色器。
为此,我需要将其作为字符串传递。
有没有办法将预处理器定义嵌入为字符串?

#include <iostream>
#ifndef SIZE
#define SIZE 16
#endif
int main() {
    const int arr[SIZE] = {}; // array size is 16 :)
    const char* str = "SIZE"; // literal is "SIZE" and not "16" :(
    std::cout << str << std::endl; // should print "16"
    std::cout << SIZE << std::endl; // prints 16, but is not a string
}
Run Code Online (Sandbox Code Playgroud)

c++ string c-preprocessor

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

如何使用预处理器将 0 和 1 连接成新的定义(将多个位定义组合为一个字节定义)?

目前,我们在配置头文件中使用如下结构来定义该固件和硬件版本是否支持特定功能:

\n
#define FEATURE_BYTE_00 0b11110011\n//                        |||||||| \n//                        |||||||FEATURE0\n//                        ||||||FEATURE1\n//                        |||||FEATURE2\n//                        ||||FEATURE3\n//                        |||FEATURE4\n//                        ||FEATURE5\n//                        |FEATURE6\n//                        FEATURE7\n
Run Code Online (Sandbox Code Playgroud)\n

根据定义,一些 #ifdef 用于将这个或那个函数编译到二进制文件中。\n但这非常令人讨厌(特别是因为某些功能位定义将取决于将来的一些其他定义),我想更改它,以便我单独定义每个功能位,然后将它们连接到生成的功能字节:

\n
#define FEATURE0 1\n#define FEATURE1 1\n#define FEATURE2 0\n#define FEATURE3 0\n#define FEATURE4 1\n#define FEATURE5 1\n#define FEATURE6 1\n#define FEATURE7 1\n
Run Code Online (Sandbox Code Playgroud)\n

但是如何将它们连接到特征字节呢?不幸的是,预处理器无法理解编译器使用的典型语法。我也尝试过串联工具,但由于某种原因它不起作用。据我了解,它只能用于字符串:

\n
#define FEATURE_BYTE_00     (FEATURE7 << 7) || (FEATURE6 << 6) ...         // Not possible \n#define FEATURE_BYTE_00     FEATURE7 ## FEATURE6                           // Also not possible\n
Run Code Online (Sandbox Code Playgroud)\n

在第二种情况下,我收到以下错误:

\n
error: \xe2\x80\x98FEATUR7FEATURE6\xe2\x80\x99 undeclared (first use in this function)\n
Run Code Online (Sandbox Code Playgroud)\n

预处理器似乎只是删除了 ## 及其周围的空格?

\n

这样做的好方法是什么?我真的很想使用预处理器来完成此操作,而不是使用 c …

c c-preprocessor

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

扩展 C 宏时的“预期主表达式”

我正在尝试默认初始化一个配置结构,该结构由一些字段组成,其中包括另一个从属配置结构 - 使用宏:

现场演示

#include <cstdio>

#define MYCLASS_DEFAULT_CONFIG mylib::options { \
    .a_ = 2, \
    .b_ = 3, \
    .subopts_ = MYCLASS_DEFAULT_SUBOPT_CONFIG() \
}

#define MYCLASS_DEFAULT_SUBOPT_CONFIG mylib::sub_options { \
    .c_ = 'A'; \
    .d_ = 'H'; \
}


namespace mylib
{
    struct sub_options
    {
        char c_;
        char d_;
    };

    struct options
    {
        int a_;
        int b_;
        sub_options subopts_;
    };


    class myclass
    {
        myclass(options opts)
            : opts_ { opts }
        {
            
        }

        options opts_;
    };
}

int main()
{
    mylib::myclass some_class(MYCLASS_DEFAULT_CONFIG()); …
Run Code Online (Sandbox Code Playgroud)

c++ struct aggregate c-preprocessor preprocessor-directive

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

下面的 C 宏示例如何编译?

下面的代码没有给出正确的输出。

#include <stdio.h>
#define PI 22/7
#define AREA(r)  PI * r * r
int main() {
    printf("Pi: %d\n", PI);
    printf("Area: %d\n", AREA(8));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

而下面的代码给出了正确的(最接近的)输出。

#include <stdio.h>
#define PI 22/7
#define AREA(r)  r * r * PI
int main() {
    printf("Pi: %d\n", PI);
    printf("Area: %d\n", AREA(8));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这些代码究竟有何不同?

为什么会这样呢?我无法理解上述代码给出不同答案的区别。

c embedded c-preprocessor

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

是否可以在多行宏中使用#if 0

我想实现如下所示的东西

#define MACRO_X \
    MACRO_1 \
    MACRO_2 \
#if condition
    MACRO_3 \
#endif
    MACRO_4 \
Run Code Online (Sandbox Code Playgroud)

c c++ c-preprocessor

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

如何将 #define 的精确文字存储在字符串中以进行打印

#define图书馆深处有一个宏,我想快速知道它的确切值。有没有办法将定义的值存储到字符串中以便我可以打印它?

#define intgr 12
#define bnry 0b00000001
#define hex 0x0A
#define str "Hello World"

String myStr;

myStr = intgr;
cout<< myStr << endl;  //Simple enough, work no problem
//12              <- actual
//12              <- expected

myStr = bnry; // using "bnry" would not work as #define does not touch inside quotes
cout<< myStr << endl;
//1               <- actual
//0b00000001      <- expected

myStr = hex;
cout<< myStr << endl;
//10               <- actual
//0x0A             <- expected

myStr = str;
cout<< myStr << …
Run Code Online (Sandbox Code Playgroud)

c-preprocessor

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

如何将#define的数据类型设置为long double?

我有一个 C 代码,其中定义了一些使用命令进行预处理的变量#define

但是,我认为有一些方法可以在 float 和 double 数据类型之间切换,例如:

#define 1.0f     // float data type
Run Code Online (Sandbox Code Playgroud)

或者

#define 1.0     // double data type
Run Code Online (Sandbox Code Playgroud)

有没有办法使用它来设置长双精度数据类型的变量?

c long-double c-preprocessor

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

在C++中使用宏实现带有自己的循环计数器的for语句

我的要求是统计程序整个运行期间程序中每个for语句循环的总次数,例如:

int for_counter_1 = 0;
int for_counter_2 = 0;

void f() {
    for (int i = 0; i < 10; i++, for_counter_2++) {
        // ...
    }
}
int main() {
    for (int i = 0; i < 10; i++, for_counter_1++) {
        f();
    }
    printf("%d\n", for_counter_1); // should output: 10
    printf("%d\n", for_counter_2); // should output: 100
    
}
Run Code Online (Sandbox Code Playgroud)

由于我的程序中有大量的for循环(一些密码算法),并且我将继续扩展它,所以我考虑使用宏来实现带有自己的循环计数器的for语句,如下所示:

#define CONCAT_INNER(a, b) a ## b
#define CONCAT(a, b) CONCAT_INNER(a, b)
#define FOR_COUNTER() CONCAT(for_counter_, __LINE__)
#define for_with_counter(...) \
    static int FOR_COUNTER() = 0; …
Run Code Online (Sandbox Code Playgroud)

c++ debugging c-preprocessor

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

如何避免同名函数和宏的定义冲突?

我定义了一个函数和一个像这样的宏来设置矩阵内部的值:

void init_matrix(Matrix *mat, double ea[],  size_t size)
{
    for (int i = 0; i < mat->row; i++)
        for (int j = 0; j < mat->col; j++) {
            if (!(i*mat->col+j<size))
                return;
            mat->entries[i][j] = ea[i*mat->col + j];    
        }
}

#define init_matrix(mat, ...) init_matrix(mat, (double []) {__VA_ARGS__}, sizeof((double []) {__VA_ARGS__})/sizeof(double))
Run Code Online (Sandbox Code Playgroud)

现在工作正常,但我正在考虑将函数声明和宏移到头文件中,然后将该头文件包含到该程序中。但是当我这样做时,它可能会将函数的定义扩展为:

void init_matrix(Matrix *mat, (double []) {double ea[], size_t size}, sizeof((double []) {double ea[], size_t size})/sizeof(double))
Run Code Online (Sandbox Code Playgroud)

这会让一切变得混乱,对吧?我怎样才能避免这种情况?也许将此函数放在文件末尾并在其之前使用 #undef init_matrix ?或者有没有一种方法可以在代码的一部分中取消定义宏并使其像该部分之前和之后一样工作?

c c-preprocessor

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