是否可以在预处理程序指令中使用非类型常量模板参数?这就是我的想法:
template <int DING>
struct Foo
{
enum { DOO = DING };
};
template <typename T>
struct Blah
{
void DoIt()
{
#if (T::DOO & 0x010)
// some code here
#endif
}
};
Run Code Online (Sandbox Code Playgroud)
当我尝试使用类似的东西时Blah<Foo<0xFFFF>>,VC++ 2010会抱怨我们尝试使用的行中无法匹配的括号#if.我猜测预处理器并不真正知道任何关于模板的事情,这种事情只是不在其领域.说啥?
首先,我希望它停止警告.但我也希望打印出一些信息性的消息(比如"回来实现这个!").
不幸的是,我的编译器不支持#info,#message,#pragma message(),等.
我知道有-Wno-error=<something>,但我的谷歌-foo是弱,我似乎无法找出<something>的#warning.我试过了-Wno-error=warning,只是说"没有-Wwarning".与" warn" 相同.
有什么建议?
值得一提的是,我使用的是Tensilica xtensa编译器,xt-xcc,它似乎是一个gnu派生词,或者至少使用了gnu前端.它的版本是8.0.0.
在C/C++代码中我尝试移植,包括一个不赞成使用的系统头:
从标题:
#ifdef __GNUC__
#warning "this header is deprecated"
#endif
Run Code Online (Sandbox Code Playgroud)
当我们在这里编译时gcc -Wall -Werror,编译停止.从长远来看,替换使用已弃用的函数是最好的,但是现在我想禁用此警告.
编译时没有任何-Werror作用,但由于这是完全自动化构建过程的一部分,我宁愿不这样做.
包括与头#undef荷兰国际集团__GNUC__之前和#define之后荷兰国际集团这是一种可能,但我担心的包含的头里面的副作用.
有没有办法禁用#warning或放松-Werror一个标题?
假设我有
#define Name Joe
Run Code Online (Sandbox Code Playgroud)
有没有办法区分宏的不同值.以下不起作用,但你明白了
#if Name==Joe
// some code
#elif Name==Ben
// some alternative code
#endif
Run Code Online (Sandbox Code Playgroud)
我想用它来生成来自相同源代码的各种目标文件.源差异很小,因此可以很容易地进行宏观控制.宏将通过-DName=Joe编译器标志传入.另请注意,这Name将是一个实际的符号名称,因此我们不能使用基于#define Joe 1等的技巧.
强制编辑请注意,这个类似的问题实际上处理的是字符串值宏.而且那里的答案没有帮助.接受的答案避免了问题(但没有解决),另一个答案strcmp在宏中使用,它依赖于扩展等.
我想splint在debian稳定的环境中运行我的一些源代码.
我需要给出预处理器指令-DUINT16_T='unsigned short',因为我经常需要它.我想将它放在我的.splintrc文件中.
从命令行运行时,splint -DUINT16_T='unsigned short' mysource.c它运行良好.如果将此行移动到我的.splintrc文件中
-DUINT16_T='unsigned short'
-I/usr/local/include/
Run Code Online (Sandbox Code Playgroud)
该splint调用导致
Cannot list files in .splintrc files:
short' (probable missing + or -)
A flag is not recognized or used in an incorrect way (Use -badflag to inhibit
warning)
Run Code Online (Sandbox Code Playgroud)
有人有解决方案吗?(请不要别名).
为了进行更深入的讨论,我将提供一个mnwe(最小的不工作示例)hello.c,这可能会有所帮助:
#include <stdio.h>
int main (void)
{
UINT16_T returnvalue=0;
printf ("Hello, world!\n");
return returnvalue;
}
Run Code Online (Sandbox Code Playgroud)
命令gcc -DUINT16_T='unsigned short' hello.c运行良好 - splint -DUINT16_T='unsigned short' hello.c …
debian whitespace splint secure-coding preprocessor-directive
我们希望使用预处理器输出文件(.i文件)进一步使用,尤其是注释.
为此,我们使用/PREPRINT(或/PP)命令行开关.
问题是KEIL编译器(C166)删除任何注释.
问:是否可以在.i文件中保留评论?
其他研究:
Microsoft编译器使用/P命令行开关执行此操作.
但他们有/C来保持评论.
为什么这段代码没有编译?如果我理解正确,这应该编译.哪里我错了?
#define THREADMODEL ASC
#if THREADMODEL==NOASC
THIS BLOCK SHOULDN'T BE COMPILED
#endif
int main() {
}
Run Code Online (Sandbox Code Playgroud) 我在考虑这样的事情:
#include <iostream> // Comment
Run Code Online (Sandbox Code Playgroud)
那么,cppreference.com(http://en.cppreference.com/w/cpp/preprocessor)声称:
预处理指令控制预处理器的行为.每个指令占用一行,格式如下:
#character preprocessing指令(define,undef,include,if,ifdef,ifndef,else,elif,endif,line,error,pragma之一)参数(取决于指令)换行符
这么好,给出了整条生产线的完整规范,并且没有地方可以在那里发表评论.在这些方面不允许建议评论.
但是,即使使用-Wall -Wextra -Wpedantic,g ++和clang ++都接受这样的输入.此外,cplusplus.com提供了此类评论的示例:http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/
更让我感到困惑的是,有人告诉我" 在#行中发表评论仍然有效,但它们可能并不意味着你想要的东西 ".我不确定这是怎么回事,因为根据http://en.cppreference.com/w/cpp/language/translation_phases评论在启动预处理器之前被空格字符替换 - 所以如果它们被允许的话#行,它们怎么会干扰这种#行的语义?
我已经写了#if DEBUG,#else,#endif的代码片段中,我注意到的Visual Studio不会让我用自动完成履行部分类型的成员名称,它不检查灰色激活代码错误.我发现再次关注的唯一方法是将构建模式从Debug切换到Release.但这很不方便,感觉有更好的方法.
例:
#if DEBUG
throw;
#else
throw new exc // I want to use autocomplete here but can't because it's greyed out
#endif
Run Code Online (Sandbox Code Playgroud)
如何让VS停止忽略其他配置范围内的其他代码#if DEBUG?
c# preprocessor-directive visual-studio-2017 visual-studio-2019
下面两行代码有什么区别?
#define F_SAMP 10000.0f
#define F_SAMP 10000.0
两个不都浮起来吗?(顺便说一句,在这种特殊情况下,编译器是 XC16,但我认为这并不重要)感谢您的关注