宏声明的默认值

问题描述 投票:0回答:1

创建宏但没有赋值时,是否有默认值?

#define MACRO
(行尾)。

宏定义的语法为:

#define <IDENTIFIER> <value>
。即使我们不传递值,也会创建宏,可以通过以下程序验证:

#include <stdio.h>
#define MACRO
int main() {
    #ifdef MACRO
        printf("MACRO was created");
    #endif
    
    return 0;
}

此外,如果标识符没有使用

#define
声明但作为
#ifdef <IDENTIFIER>
的条件传递,编译器将标识符视为常量零(假),这可以通过以下程序验证:

#include <stdio.h>
int main() 
{
    #ifdef A
        printf("No print but valid condition");
    #endif
    
    return 0;
}

它不打印任何东西,但是编译器没有警告也没有错误。

我的问题是,创建宏但没有赋值时,是否有默认值?

考虑程序:

#include <stdio.h>
#define MACRO

int main() 
{
    #if defined MACRO
        printf("%d", MACRO);
    #endif
    
    return 0;
}

获取错误信息:

error: ‘)’ token 之前的预期表达式

如果我们赋值会编译:

#include <stdio.h>
#define MACRO 3

int main() 
{
    #ifdef MACRO
        printf("%d", MACRO);
    #endif
    
    return 0;
}

我的猜测是

#define MACRO
没有分配任何值,即使
#ifdef
会将未定义的宏视为 0(或假条件);对吗?

macros c-preprocessor compiler-directives
1个回答
0
投票

创建宏但没有赋值时,是否有默认值?

不,还是?没有替换列表定义的宏扩展为空,从处理的输入中删除。或者默认值什么都不是,一个空字符串,如果你想那样看的话。

#ifdef ,编译器将标识符视为常量零

#ifdef 会将未定义的宏视为 0

没有。

#ifdef
只关心 defined 是否定义。它不关心扩展的结果。

#if
#elif
扩展表达式并将未定义的标记视为 0.

我的猜测是 #define MACRO 没有分配任何值......这是正确的吗?

 #define MACRO
 printf("%d", MACRO);

扩展为

printf("%d", );
, );
部分无效,因此会出现语法错误。

© www.soinside.com 2019 - 2024. All rights reserved.