jjzjj

c-preprocessor

全部标签

c++ - 哪个是更好的做法 : global constant or #define?

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:C++-enumvs.constvs.#define在使用#define之前,我曾在主函数中创建常量并将它们传递到需要的地方。我发现我经常传递它们,这有点奇怪,尤其是数组大小。最近我一直在使用#define,因为我不必将main中的常量传递给每个单独的函数。但现在我想到了,我也可以使用全局常量,但出于某种原因我一直对它们有点犹豫。哪个是更好的做法:全局常量或#define?还有一个相关的附带问题:如我所描述的那样从我的main传递常量是一种不好的做法吗?

c++ - 使用编译器定义的宏连接

这应该很简单,但我正在努力弄明白。我有PROJECT_NAME作为编译器(g++)-D定义,我想将它与其他一些文本连接起来以形成命名空间名称。我目前的做法是:#defineVERSION_NAMESPACEPROJECT_NAME##Versioning对于我当前的项目,我希望VERSION_NAMESPACE为Syren_DLLVersioning。相反,我得到一个编译器错误:error:'PROJECT_NAMEVersioning'hasnotbeendeclared但是根据g++调用,PROJECT_NAME被正确定义:ccacheg++...-DPROJECT_NAME=Sy

c++ - 在 C++ 中,使用 #define 还是 const 来避免魔数(Magic Number)更好?

使用#define优于const(反之亦然)有哪些优点和缺点?当我读到有关糟糕的编程实践(尤其是魔数(MagicNumber))时,我发现自己更频繁地使用#define。一些问题突然出现在我的脑海中,例如:大量使用#define不好吗?是否占用内存空间?使用const会更快吗?我读了一些关于这个的内容,但我仍然不确定,据我所知:#define定义了一个宏(不确定宏是什么意思),它处理预处理。在处理代码之前,它将已定义关键字的所有实例替换为其他内容。另一方面,const是变量,其值不能在运行时中途更改。我能想到使用const的唯一原因是该值是否依赖于其他变量。例如:#definePI3.

c++ - 如何为宏符号添加前缀?

我正在寻找标题中所述问题的一般解决方案。但作为例证考虑我的真实情况。我想得到wstring,像这样:L"hello"但是当我有一个宏时:#defineMACRO(S)...和一个电话:MACRO("hello")//noLprefix如何像以前一样定义它来获取wstring?LS被视为2个符号。 最佳答案 您需要粘贴运算符,查找预处理器的#和##以获得激动人心的新机会来解决问题并创造有趣的新问题。http://www.cprogramming.com/reference/preprocessor/token-pasting-oper

c++ - #在c++中定义一个特殊的运算符

假设我想在两个对象之间在C++中组成一个特殊的运算符!+。例如,我想使用!+,因为我认为它比任何其他运算符都更有意义。我能做的一件基本事情是找到一个免费的、未使用的运算符并使用#define进行替换:#define!+%classmyclass{public:intoperator%(myclass&c){return3;}}所以如果我以后写类似的东西a!+b对于myclass的a和b实例,它会起作用。现在,有没有什么方法可以用运算符来定义它,而不是用一些函数来定义它?像这样的东西:#definea!+b->a.operatorexclamativeplus(b)这将使翻译变得不那么脏

c++ - 将 defined(X) 返回为 true 或 false 的宏

我想要一系列宏来替换下面的代码#ifdefFOOreturntrue;#elsereturnfalse;#endif用类似的东西returnMAGICLY_EXPANDING_IFDEFINED_MACRO(FOO);您可以猜到,有很多FOO,足以将4行缩减为1行会很酷。但实际上它会用一行替换一个怪物switch语句。 最佳答案 在C++中,defined的行为仅针对条件包含(#if和#elif)指定。所以你不能以任何其他方式使用它。(相关规则见标准16.1节)但是,如果你想检测具体是#define到空字符串的宏,你不需要defin

用于命名空间限定的 C++ 预处理器 token 粘贴

我在使用gcc4.7.1(std=c++11)中的预处理器标记粘贴运算符时遇到问题。即,考虑以下代码://Createanameforaglobalmap(thisworks)#defineGLOBAL_MAP(name)g_map_##name//Thisworksfine//Now,namespacequalifythismap(thisfailstocompilewhenused)#defineNS_QUAL_GLOBAL_MAP(name)SomeNamespace::##GLOBAL_MAP(name)使用场景——首先是map定义:std::mapGLOBAL_MAP(my_

c++ - 使用#define 宏来规范类声明

我正在为我的一个项目构建一个C++DLL。我正在尝试标准化类的定义方式。所以不是每次都写:class__declspec(dllexport)ClassName我正在构建一个#define宏来简化这个过程:#defineCLASS(cName)class__declspec(dllexport)cName但是,当我使用它时,它给了我以下错误:Error:Expecteda';'我知道您可以使用#define宏来定义整个类的创建,但它是否可以仅用于定义“类头”?谢谢,请记住,我尝试这样做是因为我们要处理数百个类,所以这些“自动化”将是最有帮助的:)编辑:例子:#defineCLASS(n

c++ - 是否可以编写 C++ 模板/宏来检查两个函数是否具有相同的签名

是否可以编写C++模板/宏来检查两个函数是否具有相同的签名(返回类型和参数列表)?这是我想如何使用它的一个简单示例:intfoo(conststd::string&s){...}intbar(conststd::string&s){...}if(SAME_SIGNATURES(foo,bar)){//dosomethinguseful...makeQtsignal-slotconnectionforexample...}else{//signaturesmismatch..reportaproblemorsomething...}那么这是有可能的还是只是一个白日梦?附言事实上,我对C+

python - 解析 C++ 预处理器 #if 语句

我有一个带条件编译的C/C++源文件。在我将它发送给客户之前,我想删除大部分#if语句,这样我的客户就不必担心将正确的-D选项传递给编译器。我已经在Python中实现并工作了,但它只能正确处理#ifdef和#ifndef语句。我需要添加对#if语句的支持,但#if的语法要复杂得多。(例如,您可以使用&&、||、!、括号、关系运算符、算术等)。是否有任何现有的开源代码来解析和评估#if语句?(最好使用Python)。我所知道的唯一实现是GCC,这对于这项任务来说太复杂了。 最佳答案 作为KeithBsaid,你可以让预处理器为你做这件