Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以用C/C++;预处理器?_C++_C_Metaprogramming_Preprocessor - Fatal编程技术网

C++ 我可以用C/C++;预处理器?

C++ 我可以用C/C++;预处理器?,c++,c,metaprogramming,preprocessor,C++,C,Metaprogramming,Preprocessor,为了一些基础。基数1偶数。某种复杂的替代 当然,在实际生产代码中这样做也不是一个好主意。我只是出于好奇才这么问。我很确定C/C++预处理器只是复制和粘贴而已——它实际上不会计算任何表达式。表达式计算由编译器完成 为了更好地回答您的问题,您可能想发布您试图完成的内容。我很确定C/C++预处理器只是复制和粘贴,实际上它不会计算任何表达式。表达式计算由编译器完成 为了更好地回答您的问题,您可能希望发布您试图完成的内容。我知道这不是预处理器,但如果它有帮助,您可以使用模板来完成。也许您可以将其与宏结合使

为了一些基础。基数1偶数。某种复杂的替代


当然,在实际生产代码中这样做也不是一个好主意。我只是出于好奇才这么问。

我很确定C/C++预处理器只是复制和粘贴而已——它实际上不会计算任何表达式。表达式计算由编译器完成


为了更好地回答您的问题,您可能想发布您试图完成的内容。

我很确定C/C++预处理器只是复制和粘贴,实际上它不会计算任何表达式。表达式计算由编译器完成


为了更好地回答您的问题,您可能希望发布您试图完成的内容。

我知道这不是预处理器,但如果它有帮助,您可以使用模板来完成。也许您可以将其与宏结合使用,以实现所需的功能

#include <iostream>
using namespace std;

template <int N, int M>
struct Add
{
    static const int Value = N + M;
};

int main()
{
    cout << Add<4, 5>::Value << endl;
    return 0;
}
#包括
使用名称空间std;
模板
结构添加
{
静态常数int值=N+M;
};
int main()
{

cout我知道它不是预处理器,但是如果它有帮助,你可以用模板来做。也许你可以把它和宏结合起来,来实现你所需要的

#include <iostream>
using namespace std;

template <int N, int M>
struct Add
{
    static const int Value = N + M;
};

int main()
{
    cout << Add<4, 5>::Value << endl;
    return 0;
}
#包括
使用名称空间std;
模板
结构添加
{
静态常数int值=N+M;
};
int main()
{

cout预处理器对预处理标记进行操作,它对数字求值的唯一时间是在对
#if
#elif
指令求值期间。除此之外,数字在预处理期间不是真正的数字;它们被归类为预处理数字标记,而实际上不是数字

您可以使用令牌连接来评估基本算法:

#define ADD_0_0 0
#define ADD_0_1 1
#define ADD_1_0 1
#define ADD_1_1 2

#define ADD(x, y) ADD##_##x##_##y

ADD(1, 0) // expands to 1
ADD(1, 1) // expands to 2
实际上,虽然没有理由这样做,但这样做是愚蠢的(你必须定义大量的宏才能让它发挥更大的作用)

更明智的做法是将宏扩展为可由编译器计算的整型常量表达式:

#define ADD(x, y) ((x) + (y))

ADD(1, 1) // expands to ((1) + (1))

编译器将能够计算
1+1
表达式。

预处理器对预处理标记进行操作,它计算数字的唯一时间是在计算
\if
\elif
指令的过程中。除此之外,数字在预处理期间不是真正的数字;它们被分类为预处理数字标记,它们实际上不是数字

您可以使用令牌连接来评估基本算法:

#define ADD_0_0 0
#define ADD_0_1 1
#define ADD_1_0 1
#define ADD_1_1 2

#define ADD(x, y) ADD##_##x##_##y

ADD(1, 0) // expands to 1
ADD(1, 1) // expands to 2
实际上,虽然没有理由这样做,但这样做是愚蠢的(你必须定义大量的宏才能让它发挥更大的作用)

更明智的做法是将宏扩展为可由编译器计算的整型常量表达式:

#define ADD(x, y) ((x) + (y))

ADD(1, 1) // expands to ((1) + (1))

编译器将能够计算
1+1
表达式。

C预处理器可以计算包含整数算术的条件。它不会替换算术表达式并将结果传递给编译器,但编译器将计算编译时常量上的算术,并将结果发送到二进制文件中,如下所示:只要您没有重载正在使用的运算符。

C预处理器可以计算包含整数算术的条件。它不会替换算术表达式并将结果传递给编译器,但编译器将根据编译时常量计算算术,并将结果发送到二进制文件,只要您有“t重载正在使用的运算符。

预处理器宏不能真正进行算术运算,但可以利用它们对枚举进行算术运算。一般的技巧是使用一个调用其他宏的宏,并且可以使用这些其他宏的不同定义重复调用

例如,类似于:

#define MY_THINGS \ a_thing(FRED,4) \ a_thing(GEORGE,6) \ a_thing(HARRY,5) \ a_thing(HERMIONE,8) \ a_thing(RON,3) \ // This line left blank #define a_thing(name,size) EN_##name}; enum {EN_SIZE_##name=(size),EN_BLAH_##name = EN_##name+(size-1), enum {EN_FIRST_THING=0, MY_THINGS EN_TOTAL_SIZE}; #undef a_thing #定义我的东西\ 一件事(弗雷德,4岁)\ 一件事(乔治,6岁)\ 一件事(哈利,5岁)\ 一件事(赫敏,8岁)\ 一件事(罗恩,3岁)\ //这一行留空 #定义一个事物(名称,大小)EN##name};枚举{EN#size#name=(大小),EN#BLAH#name=EN#name+(大小-1), 枚举{EN_FIRST_THING=0,MY_THINGS EN_TOTAL_SIZE}; #取消定义一件事
这将允许为数组中的每件事情“分配”一定数量的空间。数学不是由预处理器完成的,但枚举仍然被视为编译时常量。

预处理器宏不能真正执行算术,但可以有效地利用它们对枚举进行计算。一般的技巧是具有调用其他宏的宏,并且可以使用这些其他宏的不同定义重复调用

例如,类似于:

#define MY_THINGS \ a_thing(FRED,4) \ a_thing(GEORGE,6) \ a_thing(HARRY,5) \ a_thing(HERMIONE,8) \ a_thing(RON,3) \ // This line left blank #define a_thing(name,size) EN_##name}; enum {EN_SIZE_##name=(size),EN_BLAH_##name = EN_##name+(size-1), enum {EN_FIRST_THING=0, MY_THINGS EN_TOTAL_SIZE}; #undef a_thing #定义我的东西\ 一件事(弗雷德,4岁)\ 一件事(乔治,6岁)\ 一件事(哈利,5岁)\ 一件事(赫敏,8岁)\ 一件事(罗恩,3岁)\ //这一行留空 #定义一个事物(名称,大小)EN##name};枚举{EN#size#name=(大小),EN#BLAH#name=EN#name+(大小-1), 枚举{EN_FIRST_THING=0,MY_THINGS EN_TOTAL_SIZE}; #取消定义一件事
这将允许为数组中的每件事物“分配”一定数量的空间。数学不是由预处理器完成的,但枚举仍然被视为编译时常数。

您可以相对轻松地编写以二进制形式添加两个整数的宏。例如,以二进制形式将两个4位整数相加的-macro:

#include "stdio.h"

// XOR truth table
#define XOR_0_0 0
#define XOR_0_1 1
#define XOR_1_0 1
#define XOR_1_1 0

// OR truth table
#define OR_0_0 0
#define OR_0_1 1
#define OR_1_0 1
#define OR_1_1 1

// AND truth table
#define AND_0_0 0
#define AND_0_1 0
#define AND_1_0 0
#define AND_1_1 1

// concatenation macros
#define XOR_X(x,y) XOR_##x##_##y
#define   OR_X(x,y) OR_##x##_##y
#define  AND_X(x,y) AND_##x##_##y
#define OVERFLOW_X(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) OVERFLOW_##rc1 (rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4)

// stringification macros
#define STR_X(x) #x
#define STR(x) STR_X(x)

// boolean operators
#define XOR(x,y) XOR_X(x,y)
#define   OR(x,y) OR_X(x,y)
#define  AND(x,y) AND_X(x,y)

// carry_bit + bit1 + bit2
#define BIT_SUM(carry,bit1,bit2) XOR(carry, XOR(bit1,bit2))
// carry_bit + carry_bit_of(bit1 + bit2)
#define CARRY_SUM(carry,bit1,bit2) OR(carry, AND(bit1,bit2))

// do we have overflow or maybe result perfectly fits into 4 bits ?
#define OVERFLOW_0(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) SHOW_RESULT(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4)
#define OVERFLOW_1(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) SHOW_OVERFLOW(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4)

// draft-horse macros which performs addition of two 4-bit integers
#define ADD_BIN_NUM(a1,a2,a3,a4, b1,b2,b3,b4) ADD_BIN_NUM_4(0,0,0,0, 0,0,0,0, a1,a2,a3,a4, b1,b2,b3,b4)
#define ADD_BIN_NUM_4(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) ADD_BIN_NUM_3(rc1,rc2,rc3,AND(CARRY_SUM(0,a4,b4),OR(a4,b4)), rb1,rb2,rb3,BIT_SUM(0,a4,b4), a1,a2,a3,a4, b1,b2,b3,b4)
#define ADD_BIN_NUM_3(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) ADD_BIN_NUM_2(rc1,rc2,AND(CARRY_SUM(rc4,a3,b3),OR(a3,b3)),rc4, rb1,rb2,BIT_SUM(rc4,a3,b3),rb4, a1,a2,a3,a4, b1,b2,b3,b4)
#define ADD_BIN_NUM_2(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) ADD_BIN_NUM_1(rc1,AND(CARRY_SUM(rc3,a2,b2),OR(a2,b2)),rc3,rc4, rb1,BIT_SUM(rc3,a2,b2),rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4)
#define ADD_BIN_NUM_1(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4)      OVERFLOW(AND(CARRY_SUM(rc2,a1,b1),OR(a1,b1)),rc2,rc3,rc4, BIT_SUM(rc2,a1,b1),rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4)
#define OVERFLOW(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) OVERFLOW_X(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4)
#define   SHOW_RESULT(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) STR(a1) STR(a2) STR(a3) STR(a4) " + " STR(b1) STR(b2) STR(b3) STR(b4) " = " STR(rb1) STR(rb2) STR(rb3) STR(rb4)
#define   SHOW_OVERFLOW(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) STR(a1) STR(a2) STR(a3) STR(a4) " + " STR(b1) STR(b2) STR(b3) STR(b4) " = overflow"

void main()
{
    printf("%s\n", 
        ADD_BIN_NUM(
                    0,0,0,1, // first  4-bit int
                    1,0,1,1) // second 4-bit int
                    );

    printf("%s\n", 
        ADD_BIN_NUM(
                    0,1,0,0, // first  4-bit int
                    0,1,0,1) // second 4-bit int
                );

    printf("%s\n", 
        ADD_BIN_NUM(
                    1,0,1,1, // first  4-bit int
                    0,1,1,0) // second 4-bit int
                );
}
此宏可以轻松扩展,以添加两个8位、16位甚至32位整数。 所以基本上我们只需要标记连接和替换规则,就可以用宏实现惊人的结果

编辑: 我改变了结果的格式,更重要的是,我增加了溢出检查


HTH!

您可以相对轻松地编写以二进制形式添加两个整数的宏。例如,以二进制形式将两个4位整数相加的-macro:

#include "stdio.h"

// XOR truth table
#define XOR_0_0 0
#define XOR_0_1 1
#define XOR_1_0 1
#define XOR_1_1 0

// OR truth table
#define OR_0_0 0
#define OR_0_1 1
#define OR_1_0 1
#define OR_1_1 1

// AND truth table
#define AND_0_0 0
#define AND_0_1 0
#define AND_1_0 0
#define AND_1_1 1

// concatenation macros
#define XOR_X(x,y) XOR_##x##_##y
#define   OR_X(x,y) OR_##x##_##y
#define  AND_X(x,y) AND_##x##_##y
#define OVERFLOW_X(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) OVERFLOW_##rc1 (rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4)

// stringification macros
#define STR_X(x) #x
#define STR(x) STR_X(x)

// boolean operators
#define XOR(x,y) XOR_X(x,y)
#define   OR(x,y) OR_X(x,y)
#define  AND(x,y) AND_X(x,y)

// carry_bit + bit1 + bit2
#define BIT_SUM(carry,bit1,bit2) XOR(carry, XOR(bit1,bit2))
// carry_bit + carry_bit_of(bit1 + bit2)
#define CARRY_SUM(carry,bit1,bit2) OR(carry, AND(bit1,bit2))

// do we have overflow or maybe result perfectly fits into 4 bits ?
#define OVERFLOW_0(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) SHOW_RESULT(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4)
#define OVERFLOW_1(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) SHOW_OVERFLOW(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4)

// draft-horse macros which performs addition of two 4-bit integers
#define ADD_BIN_NUM(a1,a2,a3,a4, b1,b2,b3,b4) ADD_BIN_NUM_4(0,0,0,0, 0,0,0,0, a1,a2,a3,a4, b1,b2,b3,b4)
#define ADD_BIN_NUM_4(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) ADD_BIN_NUM_3(rc1,rc2,rc3,AND(CARRY_SUM(0,a4,b4),OR(a4,b4)), rb1,rb2,rb3,BIT_SUM(0,a4,b4), a1,a2,a3,a4, b1,b2,b3,b4)
#define ADD_BIN_NUM_3(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) ADD_BIN_NUM_2(rc1,rc2,AND(CARRY_SUM(rc4,a3,b3),OR(a3,b3)),rc4, rb1,rb2,BIT_SUM(rc4,a3,b3),rb4, a1,a2,a3,a4, b1,b2,b3,b4)
#define ADD_BIN_NUM_2(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) ADD_BIN_NUM_1(rc1,AND(CARRY_SUM(rc3,a2,b2),OR(a2,b2)),rc3,rc4, rb1,BIT_SUM(rc3,a2,b2),rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4)
#define ADD_BIN_NUM_1(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4)      OVERFLOW(AND(CARRY_SUM(rc2,a1,b1),OR(a1,b1)),rc2,rc3,rc4, BIT_SUM(rc2,a1,b1),rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4)
#define OVERFLOW(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) OVERFLOW_X(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4)
#define   SHOW_RESULT(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) STR(a1) STR(a2) STR(a3) STR(a4) " + " STR(b1) STR(b2) STR(b3) STR(b4) " = " STR(rb1) STR(rb2) STR(rb3) STR(rb4)
#define   SHOW_OVERFLOW(rc1,rc2,rc3,rc4, rb1,rb2,rb3,rb4, a1,a2,a3,a4, b1,b2,b3,b4) STR(a1) STR(a2) STR(a3) STR(a4) " + " STR(b1) STR(b2) STR(b3) STR(b4) " = overflow"

void main()
{
    printf("%s\n", 
        ADD_BIN_NUM(
                    0,0,0,1, // first  4-bit int
                    1,0,1,1) // second 4-bit int
                    );

    printf("%s\n", 
        ADD_BIN_NUM(
                    0,1,0,0, // first  4-bit int
                    0,1,0,1) // second 4-bit int
                );

    printf("%s\n", 
        ADD_BIN_NUM(
                    1,0,1,1, // first  4-bit int
                    0,1,1,0) // second 4-bit int
                );
}
此宏可以轻松扩展,以添加两个8位、16位甚至32位整数。 所以基本上我们所做的一切