标签: preprocessor-directive

在预处理程序指令中使用模板参数?

是否可以在预处理程序指令中使用非类型常量模板参数?这就是我的想法:

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.我猜测预处理器并不真正知道任何关于模板的事情,这种事情只是不在其领域.说啥?

c++ templates c-preprocessor preprocessor-directive

7
推荐指数
1
解决办法
3709
查看次数

-Werror导致编译器在#warning上停止.我该怎么做才能防止这种情况发生?

首先,我希望它停止警告.但我也希望打印出一些信息性的消息(比如"回来实现这个!").

不幸的是,我的编译器不支持#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 embedded gcc c-preprocessor preprocessor-directive

7
推荐指数
1
解决办法
5967
查看次数

仅针对一个标头禁用#warning

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一个标题?

c gcc c-preprocessor preprocessor-directive

7
推荐指数
1
解决办法
599
查看次数

有没有办法检查宏的非数字值

假设我有

#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在宏中使用,它依赖于扩展等.

macros c-preprocessor preprocessor-directive

7
推荐指数
1
解决办法
555
查看次数

.splintrc预处理器指令-D中的WhiteSpaces

我想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

6
推荐指数
1
解决办法
215
查看次数

在预处理器i文件中保留注释

我们希望使用预处理器输出文件(.i文件)进一步使用,尤其是注释.
为此,我们使用/PREPRINT(或/PP)命令行开关.
问题是KEIL编译器(C166)删除任何注释.

问:是否可以在.i文件中保留评论?

其他研究:
Microsoft编译器使用/P命令行开关执行此操作.
但他们有/C保持评论.

preprocessor comments keil preprocessor-directive

6
推荐指数
2
解决办法
1438
查看次数

了解预处理程序指令

为什么这段代码没有编译?如果我理解正确,这应该编译.哪里我错了?

#define THREADMODEL ASC 

#if THREADMODEL==NOASC
THIS BLOCK SHOULDN'T BE COMPILED
#endif

int main() {
}
Run Code Online (Sandbox Code Playgroud)

c++ c-preprocessor preprocessor-directive

6
推荐指数
1
解决办法
149
查看次数

注释是否与预处理器指令在同一行上允许,在这种情况下它们的含义是什么?

我在考虑这样的事情:

#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评论在启动预处理器之前被空格字符替换 - 所以如果它们被允许的话#行,它们怎么会干扰这种#行的语义?

c++ comments preprocessor-directive

6
推荐指数
1
解决办法
930
查看次数

Visual Studio忽略#if DEBUG/RELEASE范围内的代码,不检查错误或自动完成

我已经写了#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

6
推荐指数
1
解决办法
969
查看次数

如果写小数点,还需要字母“f”吗?

下面两行代码有什么区别?

#define F_SAMP 10000.0f

#define F_SAMP 10000.0

两个不都浮起来吗?(顺便说一句,在这种特殊情况下,编译器是 XC16,但我认为这并不重要)感谢您的关注

c floating-point constants preprocessor-directive xc16

6
推荐指数
3
解决办法
518
查看次数