预处理器相等性测试,是这个标准吗?

Maw*_*awg 14 c c-preprocessor

我曾在项目偏好中设想过其中一个

  • TESTING = HOST
  • TESTING = TARGET
  • TESTING 根本没有定义

我的问题是后者.

似乎而不是

#if TESTING==HOST
#error "HOST defined"  // add temporarilly for testing porpoises
#endif
Run Code Online (Sandbox Code Playgroud)

我需要编码

#ifdef TESTING   
#if TESTING==HOST
#error "HOST defined"  // add temporarilly for testing porpoises
#endif
#endif
Run Code Online (Sandbox Code Playgroud)

我确信这不是标准行为,因为如果TESTING没有定义那么它肯定不相等HOST,而且我不需要#ifdef TESTINGGCC编译器那么多.

但是,当我使用Atmel AVR Studio(我认为它基于MS Visual Studio)时,有必要#ifdef TESTING在几十个地方添加该首字母:-(

看起来我别无选择,但我只是想知道是否有任何C标准真的需要这个.

oua*_*uah 29

#if TESTING==HOST
Run Code Online (Sandbox Code Playgroud)

如果TESTING没有定义,那么

它相当于:

#if 0==HOST
Run Code Online (Sandbox Code Playgroud)

从C标准:

(C99,6.10.1p4)"在完成由于宏扩展和已定义的一元运算符的所有替换后,所有剩余的标识符(包括与关键字词法相同的标识符)将替换为pp-number 0""


tom*_*gic 8

请注意,您可以这样做:

#ifndef TESTING
    ...
#elif TESTING == HOST
    ...
#elif TESTING == TARGET
    ...
#else
    #error "Unexpected value of TESTING."
#endif
Run Code Online (Sandbox Code Playgroud)

也:

#if defined(TESTING) && TESTING == HOST
    ...
#endif
Run Code Online (Sandbox Code Playgroud)

如果要折叠测试.括号是可选的(#if defined TESTING有效)但我认为包含它们更清楚,特别是当你开始添加额外的逻辑时.