c – 如果你只有一个标识符,#define会怎么做
通常#define将用于定义常量或宏.但是,以下列方式使用#define是有效的代码.
#define MAX // does this do anything? #define MAX 10 // I know how to treat this. 因此,如果我#define MAX 10,我知道我的预处理器将所有MAX实例替换为10.如果有人自己使用#define MAX但没有后续替换值,则它是有效的.这实际上做了什么吗? 我问的原因是我正在为c编写c编译器并且需要处理预处理器指令但我无法确定在发生这种情况时是否需要有任何功能或者我只是忽略了这一次我的预处理完成了. 我的第一直觉是,这将在我的符号表中创建一个没有名为MAX的值的符号,但同样可能它什么都不做. 作为一个问题的补充,这是一种我知道的糟糕形式,但我真的很好奇.实际代码中是否存在使用此类内容的情况? 谢谢, 解决方法
它创建一个带有空白定义的符号,以后可以在其他预处理器操作中使用.有几件事可以用于:
1)分支. 考虑以下: #define ARBITRARY_SYMBOL // ... #ifdef ARBITRARY_SYMBOL someCode(); #else /* ARBITRARY_SYMBOL */ someOtherCode(); #endif /* ARBITRARY_SYMBOL */ 符号的存在可用于分支,有选择地为情况选择适当的代码.很好地利用这个是处理特定于平台的等效代码: #if defined(_WIN32) || defined(_WIN64) windowsCode(); #elif defined(__unix__) unixCode(); #endif /* platform branching */ 根据情况,这也可用于伪代码输出.例如,如果您想要一个仅在调试时存在的函数,您可能会遇到以下情况: #ifdef DEBUG return_type function(parameter_list) { function_body; } #endif /* DEBUG */ 1A)头部防护装置. 在上面的基础上,如果标题已经包含在跨越多个源文件的项目中,则标题保护是一种dummying out整个标题的方法. #ifndef HEADER_GUARD #define HEADER_GUARD // Header... #endif /* HEADER_GUARD */ 2)贬低一个符号. 当与分支结合使用时,您还可以使用带有空白定义的定义来伪造符号.考虑以下: #ifdef _WIN32 #define STDCALL __stdcall #define CDECL __cdecl // etc. #elif defined(__unix__) #define STDCALL #define CDECL #endif /* platform-specific */ // ... void CDECL cdeclFunc(int,int,char,const std::string&,bool); // Compiles as void __cdecl cdeclFunc(/* args */) on Windows. // Compiles as void cdeclFunc(/* args */) on *nix. 通过这样的操作,您可以编写与平台无关的代码,但可以在Windows平台上指定调用约定. [请注意,标头windef.h执行此操作,将CDECL,PASCAL和WINAPI定义为不支持它们的平台上的空白符号.]这也可以在其他情况下使用,只要您需要预处理器符号才能扩展为在某些条件下的其他东西. 3)文档. 空白宏也可用于记录代码,因为预处理器可以将它们删除.微软喜欢这种方法,在windef.h中使用它来获取Windows函数原型中经常出现的IN和OUT符号. 也有可能还有其他用途,但这些是我能想到的唯一的用途. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |