Tag: c preprocessor

C中#pragma和_Pragma()之间的区别

C中的#pragma和_Pragma()什么区别? 句法: #pragma arg 和 _Pragma(arg) 我什么时候应该使用_Pragma(arg) ?

预处理器指令#if与普通if之间的区别

预处理器指令#if和正常情况( if在C中)有什么区别? 我是C的新手。

在引用的字符串中展开宏

可能重复: C宏来创建字符串 我有一个函数接受一个char*类型的参数,像f(“string”); 如果字符串参数是在函数调用中由the-fly定义的,那么如何在字符串体内扩展宏呢? 例如: #define COLOR #00ff00 f(“abc COLOR”); 相当于 f(“abc #00ff00″); 但是不执行扩展,函数接收字面上的abc COLOR 。 特别是,我需要将宏扩展为\”#00ff00\” ,以便将引用的标记与传递给f()的其余字符串参数连接起来,包括引号; 也就是说,预处理器必须完成他的工作并欢迎编译器从f(“abc COLOR”);转换代码f(“abc COLOR”); 到f(“abc \”#00ff00\””);

在C宏中,应该更喜欢做{…}而(0,0)而不是{…}而(0)?

一位客户最近对我雇主的C代码库进行了静态分析,并向我们提供了结果。 在有用的补丁中,要求将着名的do { … } while(0)宏更改为do { … } while(0,0) 。 我理解他们的补丁正在做什么(使用序列运算符将evaluate 返回到第二个“0”的值,因此效果是相同的)但是不清楚他们为什么喜欢第二个表单而不是第一个表单。 有没有合理的理由为什么人们应该更喜欢第二种forms的宏观,还是我们客户的静态分析过于迂腐?

预处理器布鲁斯有什么治疗方法吗?

我知道我可以踢预处理器以在我的特定情况下使用-E选项吐出输出。 对于生成的代码,此预处理器输出是杀气腾腾的。 例如,我有一个4gl的应用程序,而Informix将它转换为C ,这反过来又吐出了一个可怕的丑陋混乱。 我想要的是一个编辑器,它允许我指定有效的预处理器值,并只显示相关代码。 我有一些非常基本的工作在Vim匹配#ifdef和#endif ,但代码充满了更高级的结构,如#ifndef , #if和#else 。 更糟糕的是,构造在逻辑上更复杂,我认为我的Vim脚本技能不足以让我从中得到我想要的东西。 例如: #if DLEVEL > 5 #define SIGNAL 1 #if STACKUSE == 1 #define STACK 200 #else #define STACK 100 #endif #else #define SIGNAL 0 #if STACKUSE == 1 #define STACK 100 #else #define STACK 50 #endif #endif #if DLEVEL == 0 #define STACK 0 […]

C中的#define有三个点

#define LOGI(…) ((void)__android_log_print(ANDROID_LOG_INFO, “native-activity”, __VA_ARGS__)) #define LOGW(…) ((void)__android_log_print(ANDROID_LOG_WARN, “native-activity”, __VA_ARGS__)) 这是这两个宏的定义; 稍后在代码LOGI和LOGW中使用这种方式 LOGI(“accelerometer: x=%fy=%fz=%f”, event.acceleration.x, event.acceleration.y, event.acceleration.z); 就这样 LOGW(“Unable to eglMakeCurrent”); 由于我总是试图避免复杂的宏和#define ,我无法得到这个宏的实际含义。 这里的3点符号有什么作用? 这个#define后来在代码中有什么变化? 显然我知道3个点用于表示和无限量的参数,但我不知道如何阅读这种情况。

C / C ++需要一种聪明的方法来跟踪函数调用

我正在寻找一种聪明的方法来跟踪函数调用和返回。 我知道我可以使用调试器,但我希望有一种方法可以让它在调用函数时向终端输出一些东西而不必逐步执行代码。 我想我可以使用预处理器,但我不确定最好的方法是什么。 或者有没有办法使用gdb打印出有用的信息,而无需单步执行代码。

str预处理器中的strlen?

是否可以在C预处理器中实现strlen() ? 鉴于: #define MYSTRING “bob” 是否有一些预处理器宏, X ,让我说: #define MYSTRING_LEN X(MYSTRING)

仅运行预处理器,但仅用于某些语句

我在程序中定义了许多调试语句,我希望能够在没有这些语句的情况下复制源代码。 为了做到这一点,我首先看了GCC的-E命令行参数,它只运行预处理器,但这比我想要的要多得多,扩展包含的文件并添加#line语句。 例如: #include #ifdef DEBUG #define debug( s ) puts ( s ); #else #define debug( s ) #endif int main( int argc, char* argv[] ) { debug( “Foo” ) puts( “Hello, World!” ); return 0; } 我希望将其处理为: #include int main( int argc, char* argv[] ) { puts( “Hello, World!” ); return 0; } […]

使用C预处理器为scanf构造字符串文字?

我正在尝试创建一个sscanf字符串文字,以帮助在C99中防止缓冲区溢出。 目标是这样的: #define MAX_ARG_LEN 16 char arg[MAX_ARG_LEN] = “”; if (sscanf(arg, “%”(MAX_ARG_LEN-1)”X”, &input) > 0) 显而易见的“手动”解决方案如下: #define MAX_ARG_LEN 16 #define MAX_ARG_CHARS “15” char arg[MAX_ARG_LEN] = “”; if (sscanf(arg, “%”MAX_ARG_CHARS”X”, &input) > 0) 但是,在缓冲区大小为16的情况下,我更喜欢自动生成“%15X”。此链接几乎适用于我的应用程序: 将预处理程序标记转换为字符串但不处理-1。 建议?