在我目前的代码库中,我看到以下模式:
#if SOMETHING_SUPPORTED+0 != 0
...
#endif
Run Code Online (Sandbox Code Playgroud)
不幸的是,这是一个非常古老的代码库,没有人知道它是如何以及为何开始的 我认为它是从C开始的,它慢慢地转换为C类,现在它倾向于C++
我看不到使用先前构造而不是"经典"的任何明显优势,但也许我错过了一些东西:
#if SOMETHING_SUPPORTED
...
#endif
Run Code Online (Sandbox Code Playgroud)
你知道为什么会使用#if MACRO+0 != 0而不是#if MACRO?
我想知道C++和C的预处理器有多么不同.
问题的原因是关于预处理器特定问题的这个问题,其中解决问题的标准段落具有不同的措辞(和不同的段落编号),并且也是关于C++中的true和false关键字的差异.
那么,是否存在更多差异,或者这是唯一的区别.
问题的扩展是何时由C++预处理器和C预处理器以不同方式发出的源文件.
我偶尔会编写类似这样的代码:
// file1.cpp
#define DO_THIS 1
#if DO_THIS
// stuff
#endif
Run Code Online (Sandbox Code Playgroud)
在代码开发期间,我可以切换DO_THIS0到1之间的定义.
最近我不得不重新安排我的源代码并将一些代码从一个文件复制到另一个文件.但我发现我犯了一个错误,这两个部分已经分开了:
// file1.cpp
#define DO_THIS 1
Run Code Online (Sandbox Code Playgroud)
和
// file2.cpp
#if DO_THIS
// stuff
#endif
Run Code Online (Sandbox Code Playgroud)
显然我修正了错误,但后来想到了自己,为什么编译器没有警告我?我的警告级别设置为4. #if X当X未定义时,为什么不可疑?
还有一个问题:如果我在其他地方犯了同样的错误,是否有任何系统的方法可以找出?这个项目很大.
编辑:我可以理解#ifdef没有任何警告是完全合理的.但肯定#if是不同的.
我有几个配置文件,每个配置文件包含一些布尔宏的定义,设置为0或1.然后,在我的代码中,我检查这样一个宏的值,以决定激活代码的哪一部分.现在是棘手的部分:我想确保包含我的宏定义的标题.
在下面的示例中,如果我忘记包含包含FOO定义的头文件,编译器将打印"world!",而我希望它生成错误.
//in the configuration header file
#define FOO 1
//in a cpp file
#if FOO //I would like this to generate an error if I forgot to include the header file
#pragma message "Hello"
#else
#pragma message "world!"
#endif
Run Code Online (Sandbox Code Playgroud)
有可能实现这样的行为吗?怎么样?
为了澄清,我不问如果没有定义宏,如何生成错误,但是如果可以转换该#if FOO行,同时它检查布尔值并在FOO未定义时生成错误.
这样做的关键是开发人员会知道他们的代码应该包含
SPECIAL_MACRO(FOO)
Run Code Online (Sandbox Code Playgroud)
同时,检查FOO的布尔值,就好像它是一个#if FOO语句,并防止它们忘记包含头定义FOO.
我试图在xcode中设置一个c11线程示例...但它似乎没有threads.h标头,虽然它没有抱怨这里描述的宏:
http://www.open-std.组织/ JTC1/SC22/WG14/WWW /文档/ n1570.pdf
__STDC_NO_THREADS__整数常量1,用于指示实现不支持<threads.h>标头.

基于这个问题How to catch empty Defined Macro with gcc? 我还有另一个问题。如何在预处理器#if条件下捕获未定义的宏?示例代码:
#include <stdio.h>
int main()
{
#if ENABLE_SOMETHING == 1
... do something ..
#endif
return 0;
}
Run Code Online (Sandbox Code Playgroud)
ENABLE_SOMETHING当未使用 gcc 编译器(可能是某个标志)设置时,有没有办法捕获错误/警告?或者也许有我可以使用的外部工具?
我知道我可以写这样的东西:
#ifndef ENABLE_SOMETHING
#error "ENABLE_SOMETHING undefined!"
#endif
Run Code Online (Sandbox Code Playgroud)
但我在代码中有大量不同的定义(ENABLE_STH1、、...等),我不想手动修复这个问题ENABLE_STH2。ENALBE_STH3我正在为我们的项目寻找一些自动解决方案。
我正在编译一个 CUDA 程序 - 一个简单而无害的程序。无论我如何简化它或删除一些代码或包含文件,nvcc 都会告诉我:
In file included from /usr/local/cuda/bin/..//include/crt/common_functions.h:271:0,
from /usr/local/cuda/bin/..//include/common_functions.h:50,
from /usr/local/cuda/bin/..//include/cuda_runtime.h:115,
from <command-line>:0:
/usr/local/cuda/bin/..//include/crt/math_functions.h:8891:5: error: "_GLIBCXX_MATH_H" is not defined [-Werror=undef]
Run Code Online (Sandbox Code Playgroud)
我在 Linux 上使用 CUDA 9.0 或 9.1,而 CUDA 使用 GCC(5 或 6)。为什么会发生这种情况,我该如何解决?
我正在为我的AVR ATmega32微控制器编写一个"gpio"设备驱动程序.驱动程序具有初始化功能,如下所示.我使用枚举将配置传递给函数.调用此函数的一个示例是
gpio_init_port(MY_PORT_A, INPUT, HIGH);
Run Code Online (Sandbox Code Playgroud)
这会将PORTA设置为输入,默认值为HIGH.我使用switch语句来检查传递的配置,以将相应的端口设置为输入或输出.现在我想在用户输入错误输入的情况下在switch语句的"default"情况下使用#error preprocessor指令,例如
gpio_init_port(5, INPUT, HIGH);
Run Code Online (Sandbox Code Playgroud)
因此编译停止并打印错误消息.但我不知道为什么它没有按照我的预期运作.我所指的代码部分是这样的:
default:
#if (port_number != MY_PORT_A && port_number != MY_PORT_B && port_number != MY_PORT_B && port_number!=MY_PORT_D)
#error "Wrong Input. You have entered invalid port number."
#endif
Run Code Online (Sandbox Code Playgroud)
表达方式
(port_number != MY_PORT_A && port_number != MY_PORT_B && port_number != MY_PORT_B && port_number!=MY_PORT_D)
Run Code Online (Sandbox Code Playgroud)
不评估,并且不打印错误消息.但是当我改变它
#if (1)
#error "Wrong Input. You have entered invalid port number."
#endif
Run Code Online (Sandbox Code Playgroud)
它工作正常.我的另一个问题是当我写一些类似的东西时
gpio_init_port(5, ***OUTPUT***, HIGH);
Run Code Online (Sandbox Code Playgroud)
虽然我这次传递"OUTPUT",但也会打印错误消息,这不应该发生,因为默认情况仅针对"INPUT"情况定义.
gpio.h
______
typedef enum port_number{
MY_PORT_A=0,
MY_PORT_B,
MY_PORT_C,
MY_PORT_D
} port_number_t;
typedef …Run Code Online (Sandbox Code Playgroud) 我没有定义符号 SYMBOL1 和 SYMBOL2,当我看到以下代码中调用 printf 时,我感到很惊讶:
#include <stdio.h>
int main()
{
#if (SYMBOL1==SYMBOL2)
printf("Hello World");
#endif
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您能解释一下原因吗?有什么参考标准吗?
我有一些C++代码编译取决于一些#define.今天我错误地忘了带#include有定义的文件,这导致我的程序被错误的代码编译.
有什么方法可以摆脱这种潜在的错误?