Никита Asked:2024-04-09 22:44:14 +0000 UTC2024-04-09 22:44:14 +0000 UTC 2024-04-09 22:44:14 +0000 UTC 宏“__FILE__”什么时候展开? 772 我在标题中这样做lib.h #define TEST __FILE__ 然后在main.cpp: #include "lib.h" std::cout << TEST; 它打印了我的名字main.cpp。我希望有一个lib.h. 包含项和其他宏按什么顺序展开? c++ 2 个回答 Voted Best Answer user7860670 2024-04-10T00:04:58Z2024-04-10T00:04:58Z C/C++ 使用简单的文本预处理器来替换文本块。它的源文件内容分为两类: 预处理器指令是#未转义换行符之前的行。当遇到这些指令时,预处理器会处理它们,修改其行为并替换它们。在该指令的情况下#include将替换为相应的内容。文件。在(以及大多数其他指令)的情况下#define,该指令将被替换为空字符串。 程序测试是除预处理器指令之外的所有内容。在处理程序文本时,当遇到预处理器已知的标记时,它会将这个标记替换为用于替换的标记。然后,它从替换的标记开始重新处理程序文本。它重复这个过程,直到程序文本中没有更多的标记可供替换。 因此,在代码中遇到了问题: 预处理器将指令替换#include "lib.h"为文件的内容。 在处理刚刚从头文件插入的文本时,我遇到了一个指令#define TEST __FILE__ 请记住,当在程序文本中遇到标记时,TEST需要将其替换为 token __FILE__,并将指令替换为空行。 TEST在文本中遇到一个标记main.cpp。 根据之前记忆的规则替换TEST为。__FILE__ 仅处理插入的文本,它会遇到一个 token __FILE__。 将其替换__FILE__为字符串文字,其中包含当前正在进行替换的文件名,即“main.cpp”。 Stanislav Volodarskiy 2024-04-09T22:55:08Z2024-04-09T22:55:08Z 宏在替换时会扩展。如果您要在 lib.h 中使用宏,您将得到您所期望的结果: $ cat temp.h #define TEST __FILE__ void f() { puts(TEST); } $ cat temp.c #include <stdio.h> #include <temp.h> void g() { puts(TEST); } int main() { f(); g(); } $ gcc -I. temp.c $ ./a.out ./temp.h temp.c
C/C++ 使用简单的文本预处理器来替换文本块。它的源文件内容分为两类:
#
未转义换行符之前的行。当遇到这些指令时,预处理器会处理它们,修改其行为并替换它们。在该指令的情况下#include
将替换为相应的内容。文件。在(以及大多数其他指令)的情况下#define
,该指令将被替换为空字符串。因此,在代码中遇到了问题:
#include "lib.h"
为文件的内容。#define TEST __FILE__
TEST
需要将其替换为 token__FILE__
,并将指令替换为空行。TEST
在文本中遇到一个标记main.cpp
。TEST
为。__FILE__
__FILE__
。__FILE__
为字符串文字,其中包含当前正在进行替换的文件名,即“main.cpp”。宏在替换时会扩展。如果您要在 lib.h 中使用宏,您将得到您所期望的结果: