Tag: c preprocessor

确定预处理器中的优化级别?

-Og是一个相对较新的优化选项,旨在改进应用优化时的调试体验。 如果用户选择-Og ,那么我希望我的源文件激活备用代码路径以增强调试体验。 GCC提供__OPTIMIZE__预处理器宏 ,但只有在优化生效时才将其设置为1。 有没有办法学习优化级别,如-Og , -O3或-Og ,以便与预处理器一起使用?

如何使用带有点的C预处理器连接字符串?

我已经阅读了以下问题,答案似乎很清楚: 如何使用C预处理器连接两次并扩展宏,如“arg ## _ ## MACRO”? 但是如果VARIABLE最后有一个点呢? 我正在尝试做一个简单的宏,增加结构中的计数器以进行调试。 即使没有上述问题的帮助,我也可以轻松地做到这一点 #ifdef DEBUG #define DEBUG_INC_COUNTER(x) x++ #endif 并称之为 DEBUG_INC_COUNT(debugObj.var1); 但是添加“debugObj”。 每个宏看起来都非常多余。 但是,如果我尝试连接: #define VARIABLE debugObj. #define PASTER(x,y) x ## y++ #define EVALUATOR(x,y) PASTER(x,y) #define DEBUG_INC_COUNTER(x) EVALUATOR(VARIABLE, x) DEBUG_INC_COUNTER(var) gcc -E macro.c 我明白了 macro.c:6:1: error: pasting “.” and “var” does not give a valid preprocessing token 那么我应该如何改变这一点呢 DEBUG_INC_COUNTER(var); […]

如何正确拆分文件中的C程序然后包含?

我组织了我的程序,将每个实体拆分为自己的文件。 这是这样的。 main.c #include “student.h” #include “subject.h” #include “classroom.h” #define PI 3.14 int sum(int a, int b); student.h typedef struct st student; student.c #include “student.h” subject.h typedef struct sb subject; subject.c #include “subject.h” classroom.h typedef struct cr classroom; classroom.c #include “classroom.h” 我的问题是,在课堂内我需要学生和科目 。 我应该怎么包括这个? 我应该在classroom.h或classroom.c中包含这个吗? #include “student.h” #include “subject.h” 其次,我在main.c上有所有东西使用的东西,比如sum()和PI 如何以正确的方式包括在头文件中实现或在实现文件中包含头文件? 我应该包括标题或实现文件? 如果我将所有内容都放在一个文件上,那么它编译得很好,但是我没有这样做,它不能编译。

使用宏将项目附加到具有宏的数组中

我有一个数组( C语言)应该在编译时初始化。 例如: DECLARE_CMD(f1, arg); DECLARE_CMD(f2, arg); 从多个文件中调用DECLARE_CMD。 我想要对它进行预处理。 my_func_type my_funcs [] = { &f1, &f2 } 使用宏可以将项附加到静态数组? 我在gcc4上使用C99(带GNU扩展)。

仅评估一次宏参数

在下面的代码中,任何传递为retval被评估为每次使用该令牌时给出的内容。 #define _CPFS_RETURN(commit, retval) do { \ util_cpfs_exit(commit); \ return retval; \ } while (false) #define CPFS_RETURN_BOOL(retval) do { \ _CPFS_RETURN(retval, retval); \ } while (false) 例如,给定使用CPFS_RETURN_BOOL(inode && file_truncate(inode, len)); ,这是生成的: do { do { util_cpfs_exit(inode && file_truncate(inode, len)); return inode && file_truncate(inode, len); } while (0); } while (0); 显然我不想执行语句inode && file_truncate(inode, len); 不止一次。 […]

C预处理器语句是否是C语言的一部分?

我记得我的一位教授在C课程中的主张。 他说,# #define预处理器命令使程序员能够创建一个常量,以便在以后的代码中使用,并且该命令是C语言的一部分 。 /* Is this truly C code? */ #define FOO 42 由于这是一个介绍性的编程类,我怀疑他只是简化了源文件和编译器之间的关系,但我希望validation我的理解。 预处理器语句是否完全独立于C语言(取决于所使用的特定编译器)还是在C99标准中明确描述? 出于好奇,K&R曾经提到过预处理器宏吗?

#define和创建普通类型有什么区别?

在C / C ++中,使用#define [和#ifndef #endif ]来创建值有什么区别,当你可以用int或std::string [C ++]轻松完成它时呢? #ifndef MYVAL #define MYVAL(500) #endif //C++ cout << MYVAL << endl; //C printf(MYVAL); //C++ int MYVAL = 500; cout << MYVAL << endl; //C int MYVAL = 500; printf(MYVAL);

将宽字符串文字与字符串宏组合在一起

我有一个字符串宏,如下所示: #define APPNAME “MyApp” 现在我想通过执行以下操作来构造一个使用此宏的宽字符串: const wchar_t *AppProgID = APPNAME L”.Document”; 但是,这会生成“连接不匹配的字符串”编译错误。 有没有办法将APPNAME宏转换为宽字符串文字?

模块化编译时arrays扩展

让我们说我在这个场景中: main.c: #include #include #include “header.h” int iCanProcess (char* gimmeSmthToProcess); int processingFunctionsCount = 0; int (*(*processingFunctions)) (char*) = NULL; int addProcessingFunction(int (*fct)(char*)) { processingFunctionsCount++; processingFunctions = realloc(processingFunctions, sizeof(int (*)(char*))*ProcessingFunctionsCount); processingFunctions[processingFunctionsCount-1] = fct; } int main(int argc, char *argv[]) { char* dataToProcess = “I am some veeeery lenghty data”; addProcessingFunction(iCanProcess); [ … ] for(unsigned int i […]

避免重复Cerror handling

我经常编写代码,这些代码最终都是长序列 int error; error = do_something(); if (error) { return error; } error = do_something_else(with, some, args); if (error) { return error; } error = do_something_yet_again(); if (error) { return error; } return 0; 我正在寻找一种更清晰的方式来写这个,这在某种程度上避免了重复相同的检查。 到目前为止,我已经编写了一个ERROR_OR宏,它的工作方式类似于 #define ERROR_OR(origerr, newerr) \ ({ \ int __error_or_origerr = (origerr); \ (__error_or_origerr != 0) \ ? __error_or_origerr \ : […]