禁用警告的语法如下:
#pragma warning disable 414, 3021
Run Code Online (Sandbox Code Playgroud)
或者,更一般地表达:
#pragma warning disable [CSV list of numeric codes]
Run Code Online (Sandbox Code Playgroud)
是否有这些数字代码的列表以及它们要抑制的警告的描述?令我懊恼的是,我似乎无法通过谷歌找到它.
我正在玩,gcc并尝试了以下一些代码:
int A = 42;
int *B = &A;
int *C = &*B;
Run Code Online (Sandbox Code Playgroud)
并且C == &A,正如所料.但是当我尝试:
int *B = NULL;
int *C = &*B;
Run Code Online (Sandbox Code Playgroud)
原来C == NULL,没有段错误.因此,在获取其地址之前&*B实际上并未解除引用B.
我的猜测是预处理器剥离出来的情况下,&*和*&之前,他们甚至得到了编译器,因为他们否定对方,但我无法找到任何文件,以验证这是否是标准ç或编译器特定的.
被预处理器剥离出来&*,并*&和我可以期待从任何给定的编译器这种行为?
在C++ 20中,__VA_OPT__如果参数的数量大于零,则预处理器支持作为可选地扩展可变参数宏中的标记的方法.(这消除了对##__VA_ARGS__GCC扩展的需求,这是一个不可移植且丑陋的黑客.)
Clang SVN已实现此功能,但尚未为其添加功能测试宏.任何聪明的预处理器黑客能否找到一种方法来检测__VA_OPT__支持的存在与否,而不会导致硬错误或可移植性警告?
例如,永远不要像这样定义一个宏:
#define DANGER 60 + 2
Run Code Online (Sandbox Code Playgroud)
当我们执行这样的操作时,这可能是危险的:
int wrong_value = DANGER * 2; // Expecting 124
Run Code Online (Sandbox Code Playgroud)
相反,定义这样,因为你不知道宏的用户如何使用它:
#define HARMLESS (60 + 2)
Run Code Online (Sandbox Code Playgroud)
这个例子很简单,但这几乎解释了我的问题.在编写宏时,您会建议使用哪些指南或最佳实践吗?
谢谢你的时间!
我正在尝试在ASPX页面中使用预处理程序指令,但页面无法识别它.这只是我不能做的事情吗?
背景:我试图在DEBUG模式中包含完整版本的jQuery(for,well,debugging =)),以及用于发布的缩小版本.我尝试过这个,但我对ASPX <%语法并不十分熟悉.我只是从根本上误解了这种语法的作用吗?
<% #if DEBUG %>
<script type="text/javascript" src="resources/jquery-1.3.2.js" />
<% #else %>
<script type="text/javascript" src="resources/jquery-1.3.2.min.js" />
<% #endif %>
Run Code Online (Sandbox Code Playgroud) 我对C和编译过程的基本知识最近变得生疏.我试图找出以下问题的答案,但我无法连接编译,链接和预处理阶段基础知识.快速搜索谷歌也没什么帮助.所以,我决定来到最终的知识来源:)
我知道:不应该在.h文件中定义变量.可以在那里宣布它们.
原因:因为头文件可能包含在多个位置,因此重新定义变量多次(链接器给出错误).
可能的解决方法:在头文件中使用header-guard并在其中定义变量.
它真的是一个解决方案:不.因为标题保护是用于预处理阶段.那就是告诉编译器这部分已经包含在内并且不再包含它.但是我们的多重定义错误来自链接器部分 - 在编译之后很久.
整件事让我对预处理和链接的工作方式感到困惑.如果已经定义了头部保护符号,我认为预处理将不包括代码.在那种情况下,不应该解决变量问题的多重定义吗?
这些预处理指令会在标题保护下重新定义编码过程,但是链接器仍会获得符号的多个定义,会发生什么?
是否有可能在Doxygen中记录预处理器定义?我希望能够像变量或函数那样做,但Doxygen输出似乎"丢失"了定义的文档,并且也不包含定义本身.
我尝试了以下内容
/**My Preprocessor Macro.*/
#define TEST_DEFINE(x) (x*x)
Run Code Online (Sandbox Code Playgroud)
和
/**@def TEST_DEFINE
My Preprocessor Macro.
*/
#define TEST_DEFINE(x) (x*x)
Run Code Online (Sandbox Code Playgroud)
我也尝试将它们放在一个组(尝试defgroup,addtogroup和ingroup)中,而不仅仅是在"文件范围",但是也没有效果(尽管组中的其他项目是按照预期记录的).
我查看了各种Doxygen选项,但看不到任何可以启用(或阻止)文档定义的内容.
我希望在我的代码上看到Visual C++预处理器的输出 - 即相当于gcc -E.对于我的生活,我找不到相关的编译器开关.我该如何做到这一点?
根据这个问题的答案,以下代码是合法的:
#define three 3
#define nine three*3
int main()
{
std::cout << nine;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当然,它编译并运行良好.但是,上述问题的答案还指出,应该注意这些#define指令的顺序,并且#define应该在它们之前定义将在其他s中使用的指令.但是以下代码:
#define nine three*3
#define three 3
int main()
{
std::cout << nine;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译并运行良好,并打印"9".
我的编译器是否让我轻松,或者订单确实与使用其他#defines的#defines无关?编译是否会在更复杂的项目中失败?
值得一提的是,上述问题涉及C,而我的代码是C++.这是(假设的)行为差异的来源吗?
我是C++的新手,所以我不知道他们在phidget-code示例中对这个错误的含义是什么:
Main.cpp:8:16:错误:数字常量之前的预期unqualified-id
//verander de volgende informatie naar de informatie voor jouw database
#define dserver "oege.ie.hva.nl"
#define duser "username"
#define dpassword "password"
#define ddatabase "databasename"
#define homeid 1234 //line 8
Run Code Online (Sandbox Code Playgroud)
有语法错误吗?或者是其他东西?我使用#define而不是int.
编辑:添加完整的错误日志..
完整的错误日志:http://pastebin.com/3vtbzmXD
完整的main.cpp代码:http://pastebin.com/SDTz8vni
c-preprocessor ×10
c++ ×5
c ×3
c# ×2
addressof ×1
asp.net ×1
c++20 ×1
doxygen ×1
header-files ×1
indirection ×1
linker ×1
pragma ×1
standards ×1
syntax ×1
visual-c++ ×1