Questions tagged «c-preprocessor»

在编译C和C ++语言程序之前应用的文本宏处理器。此标记还可以用于有关其他衍生自或具有相同功能的编译器/语言的问题,例如Objective-C或C#中的#指令。

8
为什么预处理器宏是邪恶的,还有哪些替代方法?
我一直问这个问题,但是我从来没有收到一个很好的答案。我认为几乎所有程序员甚至在编写第一个“ Hello World”之前都遇到过诸如“永远不应该使用宏”,“宏是邪恶的”之类的短语,我的问题是:为什么?这么多年后,有了新的C ++ 11,还有真正的替代选择吗? 最简单的部分是关于#pragma特定于平台和编译器的宏,例如,它们在大多数情况下都具有严重缺陷,例如#pragma once在至少两种重要情况下容易出错:在不同路径中具有相同名称,并且在某些网络设置和文件系统中。 但是总的来说,宏及其用法的替代方案又如何呢?


1
##(双哈希)在预处理程序指令中做什么?
#define DEFINE_STAT(Stat) \ struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat; 上面的内容摘自Unreal 4,我知道我可以在虚幻的论坛上提出这个问题,但是我认为这是一个一般的C ++问题,值得在这里提出。 我知道第一行定义了一个宏,但是我并不精通C ++中的预处理器恶作剧,所以我迷路了。逻辑告诉我反斜杠表示声明继续到下一行。 FThreadSafeStaticStat看起来有点像模板,但是里面有#的代码,而且是我在C ++中从未见过的语法 有人可以告诉我这是什么意思吗?我了解您可能无法使用Unreal 4,但这只是我不了解的语法。

3
使用C预处理器将int连接到字符串
我试图弄清楚如何使用C预处理器将#define'd int串联为#define'd字符串。我的编译器是CentOS 5上的GCC 4.1。该解决方案也应适用于MinGW。 我想在字符串上附加一个版本号,但是唯一可以使它起作用的方法是将版本号的副本定义为字符串。 我能找到的最接近的东西是引用宏参数的方法,但不适用于#defines 这是行不通的。 #define MAJOR_VER 2 #define MINOR_VER 6 #define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER 它不没有工作,#小号或者是因为值为数字,它会扩大到"/home/user/.myapp" 2 6,这是无效的Ç。 确实可以,但是我不喜欢定义版本的副本,因为我确实也需要它们作为数字。 #define MAJOR_VER 2 #define MINOR_VER 6 #define MAJOR_VER_STR "2" #define MINOR_VER_STR "6" #define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING

4
如何使用宏参数作为字符串文字?
我试图弄清楚如何编写一个宏,该宏将变量名的字符串文字表示形式与变量本身一起传递给函数。 例如,给出以下功能。 void do_something(string name, int val) { cout << name << ": " << val << endl; } 我想写一个宏,这样我就可以做到这一点: int my_val = 5; CALL_DO_SOMETHING(my_val); 哪个会打印出来: my_val: 5 我尝试执行以下操作: #define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR); 但是,您可能会猜到,引号内的VAR不会被替换,而只是作为字符串文字“ VAR”传递。因此,我想知道是否有一种方法可以将宏参数转换为字符串文字本身。

19
在C中将枚举类型的变量用作字符串的简单方法?
这是我想要做的: typedef enum { ONE, TWO, THREE } Numbers; 我正在尝试编写一个函数,该函数将执行类似于以下的切换情况: 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; } 除了在每种情况下进行定义之外,还有没有办法像我在上面尝试的那样使用enum变量进行设置?

13
##预处理程序运算符和陷阱需要考虑哪些应用?
正如我之前的许多问题中提到的那样,我正在研究K&R,目前正在使用预处理器。##预处理程序运算符是更有趣的事情之一,这是我以前学习C的任何尝试中从未知道的事情。根据K&R: 预处理程序运算符## 提供了一种在宏扩展过程中连接实际参数的方法。如果替换文本中##的参数与a相邻,则该参数将被实际参数替换, ##并删除空格和周围的空白,然后重新扫描结果。例如,宏paste 将其两个参数串联在一起: #define paste(front, back) front ## back 因此paste(name, 1)创建令牌 name1。 有人将如何以及为什么在现实世界中使用它?使用它的实际例子是什么,是否有需要考虑的地方?


2
确切地说,双字符串技巧是如何工作的?
至少某些C预处理程序使您可以将宏的值而不是其名称进行字符串化,方法是将其通过一个类似于函数的宏传递给另一个对其进行字符串化的宏: #define STR1(x) #x #define STR2(x) STR1(x) #define THE_ANSWER 42 #define THE_ANSWER_STR STR2(THE_ANSWER) /* "42" */ 这里的示例用例。 这确实有效,至少在GCC和Clang(都带有-std=c99)中有效,但是我不确定它在C标准术语下如何工作。 C99是否可以保证这种行为? 如果是这样,C99如何保证? 如果不是,那么行为在什么时候从C定义变为GCC定义?



6
#define vs const in Objective-C
我是Objective-C的新手,并且关于const和预处理指令还有一些问题#define。 首先,我发现无法使用定义常量的类型#define。这是为什么? 其次,使用其中一个相对于另一个有什么优势吗? 最后,哪种方法更有效和/或更安全?

7
了解Linux内核中的container_of宏
当我浏览Linux内核时,我发现了一个container_of定义如下的宏: #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) 我了解container_of的作用,但我不明白的是最后一句话,即 (type *)( (char *)__mptr - offsetof(type,member) );}) 如果我们按如下方式使用宏: container_of(dev, struct wifi_device, dev); 最后一句话的相应部分是: (struct wifi_device *)( (char *)__mptr - offset(struct wifi_device, dev); 看起来什么也没做。有人可以在这里填补空白吗?

6
#ifdef里面#define
我正在尝试写这样的东西: #define COV_ON(x) \ #ifdef COVERAGE_TOOL \ _Pragma (COVERAGE #x) #endif 有什么办法可以这样定义COV_ON吗?我知道我在上面所做的事情是错误的,因为我无法#ifdef在#define中使用。(#不允许使用#define)。那有什么解决办法吗?
80 c  c-preprocessor 

4
多行预处理器宏
如何使多行预处理器宏?我知道如何写一行: #define sqr(X) (X*X) 但我需要这样的东西: #define someMacro(X) class X : public otherClass { int foo; void doFoo(); }; 我怎样才能使它工作? 这只是一个例子,实际的宏可能很长。
79 c++  c  c-preprocessor 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.