2016-12-16 65 views
0

#define TML_ID - 没有值分配给TML_ID。编译或构建可执行文件没有问题。这是否会将任何默认值(如null)分配给TML_ID或将TML_ID视为未定义?如果#define在没有赋值的情况下使用,它会做什么?

+0

你怎么知道它没有价值?那么空串呢? – e0k

+3

[C重复](http://stackoverflow.com/questions/13892191/empty-macro-definition-in-c),在C + +中相同的答案。 – juanchopanza

回答

4

这只是说,宏定义,这样你就可以做到这一点在main或任何其他功能:

#ifdef TML_ID 
printf("Defined!\n"); 
#else 
printf("Undefined!\n"); 
#endif 
+0

'#endif'(不得不) – qxz

+0

@qxz,是的,我忘记了,谢谢指出。现在编辑。 – ForceBru

+0

谢谢。是的,即使没有赋值,也会被视为已定义。 – JSRK

0

#define不分配一个值宏。实际上,它被认为是一个标志,告诉编译器已经定义了一个特定的宏。

您可以想象,如果您声明一个变量而不指定任何值。它会有一个垃圾值,但它会在内存中保留一个空间。但是如果是宏,定义将不会保留空间。只有编译器的提示。

+0

感谢您的解释。 – JSRK

+0

没有任何替换文本的宏没有垃圾值。 –

+0

@PeteBecker这是正确的,这就是为什么我使用术语“标志”。这也是一个没有定义的宏和一个未使用的变量之间的区别。 – Sam

0

没有分配一个值,以这种方式的宏通常用于防止包括相同h文件多次,这样:

#ifndef _FILENAME 
#define _FILENAME 

//declaration code 

#endif 

如果某些cpp文件包括,例如,两个不同的.h文件,它们都包含我们的.h文件,那么.cpp将只有一个声明代码副本,因为第二次_FILENAME宏将被定义,并且声明代码将被跳过。

+0

以下划线开头并以大写字母('_FILENAME')开头的名称和包含两个连续下划线的名称保留供实施使用。不要在你的代码中使用它们。 –

0
#define MACRO 

定义了一个名为MACRO的宏。它没有内容,所以如果你写了类似std::cout << MACRO的东西,你会得到一个错误,因为那里什么都没有。这通常用于有条件地使用新的关键字:

#if CPP_VERSION_C11 
    #define NOEXCEPT noexcept 
#else 
    #define NOEXCEPT 
#endif 

void f() NOEXCEPT { 
    // whatever 
} 

还有两种其他方式可以使用这样的宏。您可以检查它是否是定义:

#ifdef MACRO 
    // code for one branch 
#else 
    // code for other branch 
#endif 

对于代码,因为MACRO已定义,预处理器将着眼于在第一分支代码,并跳过代码在第二分支。如果MACRO尚未定义,它将跳过第一个分支中的代码而不是第二个分支中的代码。你也可以做同样的事情是这样的:

#if defined(MACRO) 

,或者你可以在预处理器指令使用的常量表达式:

#if MACRO 
    // code for one branch 
#else 
    // code for other branch 
#endif 

这里,MACRO得到值0,则#if看到值0,并且预处理器跳过第一个分支。同样的事情发生在更复杂的表达式:

#if MACRO + 1 > 0 
    // code for one branch 
#else 
    // code for other branch 
#endif 

这里,MACRO的值为0,MACRO + 1具有值1,并且第一分支将被选择。

相关问题