如果使用#Define而没有任何分配值,它将做什么
If #define is used without any assignment value, what will it do?
#define TML_ID
-未分配给tml_id的值。编译或构建可执行文件没有问题。这将分配任何默认值(例如null)到tml_id还是将tml_id视为未定义?
这只是说宏是定义的,因此您可以在main
或任何其他功能中执行此操作:
#ifdef TML_ID
printf("Defined!n");
#else
printf("Undefined!n");
#endif
#define
不会为宏分配一个值。实际上,它被认为是告诉编译器已经定义了特定宏的标志。
您可以想象它好像您在不分配任何值的情况下声明变量一样。它将具有垃圾价值,但它将在内存中保留一个空间。但是,如果有宏观,则该定义不会保留一个空间。仅是编译器的提示。
没有分配的值,以这种方式宏通常用于预防多次包含相同的.h文件,这样:
#ifndef _FILENAME
#define _FILENAME
//declaration code
#endif
如果某些.cpp文件包括两个不同的.h文件,这两个文件都包括我们的.h文件,则.cpp将只有一个声明代码的副本,因为第二次将定义_filename acra,并且声明代码将跳过。
#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,并且将选择第一个分支。
相关文章:
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- unique_ptr:在分配之前调用 reset 有什么效果
- 将指针分配给另一个指针时会发生什么情况?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 为对象分配整数.输出将是什么?
- 重新分配向量时,向量中的内存会发生什么情况
- C++程序什么都不做,但瓦尔格林德显示内存分配
- C++指针中的这两种类型的值分配有什么区别?
- 删除类成员的动态分配内存的最佳方法是什么
- 我在 2D 数组的动态内存分配中遇到了一些奇怪的代码C++? 请解释一下这是什么?
- 虚函数如何工作,分配后新的返回类型会发生什么?
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- 如果链表被重新分配,会发生什么
- 堆指针不会被分配给数组有什么原因吗
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 右值需要分配什么向后兼容性
- scanf() 语句中"%*[^n]"的格式字符串指示什么?分配抑制器 (*) 和否定扫描集 ([^) 如何协同工作?
- 在C++中,从构造函数中将字符串文本分配给成员const char*变量时会发生什么
- 按引用传递和动态内存分配之间的区别是什么
- 如何知道是什么分配了给定的内存块