Tag:

C中的#和##宏

计划1: #include #define foo(x, y) #x #y int main() { printf(“%s\n”, foo(k, l)); //prints kl return 0; } 计划2: #include #define foo(m, n) m ## n int main() { printf(“%s\n”, foo(k, l)); //compiler error } 为什么这两个程序的输出变化如此? 这两个程序之间的确切区别是什么?

在这个宏观包装中展示了什么概念?

一堆代码刚交给我,我对标题中的宏感到困惑。 我无法理解它们的用途: #define WRAPPER_MACRO(symbol) symbol #define ANOTHER_SYMBOL WRAPPER_MACRO(ANOTHER_SYMBOL) #define PREFIXED_ANOTHER_SYMBOL WRAPPER_MACRO(PFX_ANOTHER_SYMBOL) 为什么这样? 有什么好处? 编辑:这不是我的代码库中的实际逐字代码,但它具有相同的模板。 我只是替换了宏名称。

如何在gcc的编译时识别x86与x86_64?

我想仅在x86和x86_64 linux上编译我的部分代码,而不是s390 linux或其他。 如何在C中使用宏定义来实现呢? 我知道linux是确定linux OS,而386,486和586确定CPU架构。 是否有一个简单的宏定义来确定x86 linux和x86_64 linux? 谢谢

有没有办法控制宏扩展顺序

我希望有人可能知道如何控制/指定宏扩展的顺序。 以下是上下文: // 32 bit increments, processor has registers for set, clear and invert #define CLR_OFF 1 #define SET_OFF 2 #define INV_OFF 3 #define SET(reg,bits) *((volatile unsigned long*)(& reg+SET_OFF)) = bits //Now if I use this I can do it quite nicely with #define STATUS_LED 0x0040; SET(LATB, STATUS_LED); // LATB is port of the LED. […]

为什么这些连续的宏替换不会导致错误?

该程序将输出设为5.但是在替换所有宏之后,它将导致–5 。 这应该导致编译错误,试图减少5 。 但它编译并运行良好。 #include #define A -B #define B -C #define C 5 int main() { printf(“The value of A is %d\n”, A); return 0; } 为什么没有错误?

在#define子句中,如何使预处理器替换变量名中的参数?

我有以下代码: #define MY_MACRO(PARAM) int PARAM_int; double PARAM_double; [subsequent instructions] 不幸的是,它不起作用,这意味着PARAM不会在变量名称中被替换。 这可以解决吗?

C中的宏定义错误?

#define SOUND_SPEED 0.034; int rtt; //round trip time in microsecond double distance; distance = (double)(rtt*SOUND_SPEED)/2; 它抱怨错误:在’/’标记之前的预期表达。 是不是因为我不能使用宏来定义小数或什么?

类似函数的宏与宏

gcc (GCC) 4.7.2 c89 你好, 我一直在看测试套件,我注意到这个类似函数的宏声明如下: #define MU_SUITE_START() char *msg = NULL 但是,做这件事有什么不同之处: #define MU_SUITE_START char *msg = NULL 宏只是做文本替换,所以我不认为会有任何性能问题。 使用cpp我得到以下结果,所以这里没什么特别的。 function一样的宏 char *msg = __null; 马尔科 char *msg = __null; 只是旁注:是否值得声明一个不提供输入参数的函数式marco? 在这里,我没有传递任何参数,即 #define PRINT_MSG() printf(“This is the message\n”) 如果没有输入参数,为什么还要使用类似函数的宏,这不是更好吗? #define PRINT_MSG printf(“This is the message\n”) 非常感谢任何建议,

对C标准有任何限制,允许将函数实现为宏吗?

通常,除了提供函数声明之外,C标准头文件还可以提供“屏蔽宏”以使事情更快。 例如,如果我包含ctype.h ,则头文件将声明 int isdigit(int c); 但它也可能用宏掩盖声明。 我相信这是一个根据C标准的便携式isdigit宏: #define isdigit(c) ((c) >= ‘0’ && (c) <= '9') 当然,这个宏也很危险,因为如果在定义宏时执行此操作会引入未定义的行为: int c = ‘A’; printf(“%d\n”, isdigit(c++)); 为了避免UB在这个假设的情况下,我必须用parens: (isdigit)(c++)包围函数名。 所以,我的问题是:标准头可以定义哪种屏蔽宏有什么限制吗? 如果参数表达式有副作用,或者它们在技术上是否允许具有奇怪的行为(例如我们在上面看到),它们是否保证不会导致未定义的行为? 限制在哪里?

宏中参数的意外多重评估

为什么第二个printf的输出是:最大50和67是62? 为什么不是50和62的最大值是57? #define MAX(a,b) ((a)>(b) ? (a): (b)) int incr(){ static int i =42; i += 5; return i; } int _tmain(int argc, _TCHAR* argv[]) { int x = 50; printf(“max of %d and %d is %d\n”,x, incr(), MAX(x, incr())); printf(“max of %d and %d is %d”,x, incr(), MAX(x, incr())); return 0; }