Tag:

宏执行整数运算

是否可以使用宏执行算术(我的情况下的乘法)? 我明白写一个像: #define mult(a,b) ((a)*(b)) 将产品替换到处都是。 但我有两个参数作为常量。 我知道编译器也会静态执行乘法,但问题是我必须使用#将结果转换为字符串。 知道如何做到这一点? 如果它可以用C ++宏完成,我还是可以的。 我可以用C ++编写那些特定的模块并将其链接起来。 以下是我目前的代码 #define ARG_COPY() __asm__(“subq $8, %rsp”); \ __asm__(“movq %gs:0xe8, %r10”); \ __asm__(“movq $16, %r11”); \ __asm__(“1:”); \ __asm__(“movq -8(%r10, %r11, 8), %rax”); \ __asm__(“pushq %rax”); \ __asm__(“decq %r11”); \ __asm__(“jne 1b”); \ #define ARG_REMOVE() __asm__(“add $136, %rsp”); 现在上面的代码是在没有参数的情况下编写的 – 136是16 * 8 […]

如何连接,评估和字符串化宏?

我试图对宏连接的替换(评估)进行字符串化。 例如: #include #define FOO_ONE 12 #define FOO_TWO 34 #define BAR_ONE 56 #define BAR_TWO 78 #define MAKE_MAC(mac) // … what to do here? void main(int argc, char *argv[]) { printf(“FOO: ” MAKE_MAC(FOO) “\n”); printf(“BAR: ” MAKE_MAC(BAR) “\n”); } 我想要的结果是: FOO: 1234 BAR: 5678 我尝试了几种forms,我认为最好的尝试是这样的: #define STRINGIFY(mac) #mac #define CONCAT(mac1, mac2) STRINGIFY(mac1 ## mac2) #define MAKE_MAC(mac) […]

为什么我的简单C宏不起作用?

我想制作一个像这样调用printf()两次的简单宏 #ifdef ENABLE_DEBUGPRINTF #define DEBUGPRINTF(msg) printf(“At sim_time = %f:”, sim_time); printf(msg); #else #define DEBUGPRINTF(msg) //evalutes to nothing #endif 现在我打电话的时候 DEBUGPRINTF(“Processed event type: %d with value %f\n”, id, data) 它正确打印第一部分“at sime_time = …”但后面的部分显示“已处理事件…”,错误地打印了id和数据的值。 与此同时 printf(“Processed event type: %d with value %f\n”, id, data); 正确打印值。 当我尝试通过写出我认为宏将评估的内容来执行它时,我有。 printf(“At sim_time = %f:”, sim_time); printf(“Processed event type: %d with value […]

一些宏语句在C ++中可能有意想不到的结果?

哪个宏语句可能会导致意外结果? #define YEAR_LENGTH 365 #define MONTH_LENGTH 30 #define DAYCALC(y, m, d) ((y * YEAR_LENGTH) + (m * MONTH_LENGTH) + d) int main() { int x = 5, y = 4 , z = 1; cout << DAYCALC(x *3 , y %3 , z) << endl ; cout << DAYCALC(x +12 , y , 300) << […]

C宏用于更复杂的function

我已经看过宏的简单例子,但是想知道更复杂的事情,比如使用if语句并重新分配给定的变量。 像这样的更复杂的表达式可以在宏中完成吗? 我有一个可以运行数十亿次的函数,所以让预处理器只是将代码放在那里而不是来回传递变量会很好。 说我有以下function: int foo(int a, int b, int c){ if (a > 2) c = a; if (b > 3) c = b; return a + b + c; } 我怎样才能把它变成一个宏?

C中预处理器条件下的字符串比较

我在makefile中传递一个名为DPATH的编译器选项,类似于DPATH=/path/to/somefile 。 基于此,我必须写一个宏,这样: #if “$(DPATH)”==”/path/to/x” #error no x allowed #endif 如何将DPATH与预处理器条件测试中的字符串进行比较?

C编程:预处理器,宏作为标记

我正在尝试做一些概念上与此相似的事情,但似乎无法让它发挥作用(最后显示的错误)任何想法? #include int main( int argc , char const *argv[] ) { int abc_def_ghi = 42; #define SUFFIX ghi #define VAR(prefix) prefix##_def_##SUFFIX printf( “%d\n” , VAR(abc) ); return 0; } // untitled:8: error: ‘abc_def_SUFFIX’ undeclared (first use in this function)

在C / C ++中定义类型化常量数

在C / C ++中,说(1U)与((unsigned int)1)之间有区别吗? 我更喜欢第二个,但我担心第二个可能在运行时进行类型转换(即额外的cpu周期),而第一个在编译时获得正确的类型。 谢谢。

下面的宏可以用于什么?

#define MEMCACHED_COMMAND_GET(arg0, arg1, arg2, arg3, arg4) #define MEMCACHED_COMMAND_GET_ENABLED() (0) 上面的宏似乎完全没用,它们可以用于什么?

如何使用宏将字符串转换为变量名?

#define TRACE(arg1,…) char* arg1; int main(void) { int a=4; TRACE((“Hello”,a)); // convert “Hello” to a valid char variable name. return 0; } 我在将字符串”Hello”转换为变量名时遇到了麻烦。 例如: “Hello”应该转换为const char* Hello; 通过使用宏。 由于有双引号,我无法转换它。 这是Stack Overflow中的第一个问题。