Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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
##(双哈希)在预处理器指令中做什么? \define\u STAT(STAT)\ 结构fthreadsafesticstat statpttr##Stat; 上面的线取自非真实4,我知道我可以在不真实的论坛上问它,但我认为这是一个普通的C++问题,值得在这里问。 我知道第一行定义了宏,但是我不精通C++中的预处理程序,所以我在那里丢失了。逻辑告诉我反斜杠意味着声明继续到下一行_C++_C_Concatenation_C Preprocessor - Fatal编程技术网

##(双哈希)在预处理器指令中做什么? \define\u STAT(STAT)\ 结构fthreadsafesticstat statpttr##Stat; 上面的线取自非真实4,我知道我可以在不真实的论坛上问它,但我认为这是一个普通的C++问题,值得在这里问。 我知道第一行定义了宏,但是我不精通C++中的预处理程序,所以我在那里丢失了。逻辑告诉我反斜杠意味着声明继续到下一行

##(双哈希)在预处理器指令中做什么? \define\u STAT(STAT)\ 结构fthreadsafesticstat statpttr##Stat; 上面的线取自非真实4,我知道我可以在不真实的论坛上问它,但我认为这是一个普通的C++问题,值得在这里问。 我知道第一行定义了宏,但是我不精通C++中的预处理程序,所以我在那里丢失了。逻辑告诉我反斜杠意味着声明继续到下一行,c++,c,concatenation,c-preprocessor,C++,C,Concatenation,C Preprocessor,fthreadsafesticstat看起来有点像一个模板,但是里面有#的东西,还有一种我在C中从未见过的语法++ 有人能告诉我这是什么意思吗?我知道您可能无法访问Unreal 4,但这只是我不理解的语法。##是用于连接的预处理器运算符 所以如果你使用 DEFINE\u STAT(foo) 在代码的任何地方,它都会被替换为 struct fthreadsafesticstat statptpr_foo 在编译代码之前 下面是我的另一个例子来进一步解释这一点 #define DEFINE_STAT

fthreadsafesticstat看起来有点像一个模板,但是里面有#的东西,还有一种我在C中从未见过的语法++

有人能告诉我这是什么意思吗?我知道您可能无法访问Unreal 4,但这只是我不理解的语法。

##
是用于连接的预处理器运算符

所以如果你使用

DEFINE\u STAT(foo)

在代码的任何地方,它都会被替换为

struct fthreadsafesticstat statptpr_foo

在编译代码之前

下面是我的另一个例子来进一步解释这一点

#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;
在此代码上调用预处理器时

  • begin
    替换为
    decode(a,n,i,m,a,t,e)
  • 解码(a,n,i,m,a,t,e)
    替换为
    m#a#i#n
  • m#a#i#n
    替换为
    main
因此,有效地将
begin()
替换为
main()

TLDR<代码>#
用于连接,
#
用于字符串化(从)

##
连接连续标识符,当您希望将函数作为参数传递时,它非常有用。下面是一个示例,其中
foo
接受函数参数作为其第一个参数,运算符
a
b
作为第二个和第三个参数:

Stumped?

您可以阅读关于##运算符的内容,其中
##
可以称为串联运算符。哦,这太酷了!这解释了很多,谢谢。但是为什么要使用struct关键字呢?这行看起来更像一个变量定义据我所知,
struct
引入了一个复杂的类型说明符。正式名称是“token pasting operator”,因为它结合了两个预处理标记来生成另一个。请注意,只有当结果是有效的预处理令牌时,它才有效,例如,您不能执行
+##3
使
+3
。(但是你当然可以做
+3
,没有操作员)我没想到会想那么多来学习###的行为,但我想现在我永远不会忘记它了?所以,谢谢。我花了一点时间来理解它,但这是对这个问题的一个极好的回答。谢谢
Stumped?
#include <stdio.h>
enum {my_sum=1, my_minus=2};
#define foo(which, a, b) which##x(a, b)
#define my_sumx(a, b) (a+b)
#define my_minusx(a, b) (a-b)

int main(int argc, char **argv) {
    int a = 2;
    int b = 3;
    printf("%d+%d=%d\n", a, b,  foo(my_sum, a, b));  // 2+3=5
    printf("%d-%d=%d\n", a, b, foo(my_minus, a, b)); // 2-3=-1
    return 0;
}
#include <stdio.h> 
#define bar(...) puts(#__VA_ARGS__)
int main(int argc, char **argv) {
    bar(1, "x", int); // 1, "x", int
    return 0;
}