macro expand error

cat test_macro.c
#define TEST_MACRO(b)   chip->##b

int main(void)
{
        TEST_MACRO(yyy)

        return 0;
}
gcc -E test_macro.c
# 1 "test_macro.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "test_macro.c"


int main(void)
{
test_macro.c:1:29: error: pasting "->" and "yyy" does not give a valid preprocessing token
 #define TEST_MACRO(b)   chip->##b
                             ^
test_macro.c:5:9: note: in expansion of macro ‘TEST_MACRO’
         TEST_MACRO(yyy)
         ^
        chip->yyy

        return 0;
}

What's pasting in above block ?
It is often useful to merge two tokens into one while expanding macros. This is called token pasting or token concatenation.

Reference :

3.5 Concatenation in [The C Preprocessor] for GCC version 8.1.0]

Question :

What's valid preprocessing token ?
preprocessing-token:

  • head-name
  • identifer
  • pp-number
  • character-constant
  • string-literal
  • punctuator
  • each non-white-space character that cannot be one of the above

Error message mean that "->" is not a valid preprocessing token ?
or
"->" is not a valid preprocessing token for operator "##" ?

Solve :

cat test_macro.c
#define TEST_MACRO(b)   chip->b

int main(void)
{
        TEST_MACRO(yyy)

        return 0;
}
gcc -E test_macro.c
# 1 "test_macro.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "test_macro.c"


int main(void)
{
        chip->yyy

        return 0;
}

Reference :

https://stackoverflow.com/questions/13216423/error-pasting-and-red-does-not-give-a-valid-preprocessing-token

[To be continued]

转载于:https://www.cnblogs.com/youchihwang/p/9029477.html

<think>好的,用户现在遇到了一个错误:“错误:Error Invalid Macro file header OK”。我需要先理解这个错误的原因以及如何解决。 首先,用户可能在Tecplot中运行宏时遇到了这个问题。错误信息提到“Invalid Macro file header”,这通常意味着宏文件的头部格式不正确。Tecplot的宏文件需要以特定的文件头开始,比如版本号或者正确的注释格式。如果用户自己编写了宏,可能在文件开头缺少了必要的标识符或者格式错误。 接下来,我要考虑用户可能的操作步骤。用户可能尝试运行自己创建的宏文件,但文件开头没有正确的标识符,例如没有以“#!MC 1410”这样的版本号开头。或者,用户可能在保存宏文件时使用了错误的编码或文件扩展名,比如保存为.txt而不是.mcr。此外,宏文件中可能存在非法字符或者语法错误,比如在注释行使用了错误的符号,或者命令拼写错误。 用户可能不太清楚Tecplot宏文件的结构要求,所以需要详细解释正确的文件头应该是什么样子的。例如,有效的宏文件通常以版本声明开始,如“#!MC 1410”,或者至少有一个正确的注释行。同时,需要提醒用户检查文件的扩展名是否为.mcr,并且确保没有在文件开头添加了多余的空格或特殊字符。 另外,用户可能是在复制宏代码时不小心加入了不可见的字符,或者使用了不兼容的文本编辑器,导致文件头不符合Tecplot的要求。这时候需要建议用户使用纯文本编辑器(如Notepad++或VS Code)来编辑宏文件,并确保保存时编码为UTF-8,没有BOM头。 还需要考虑用户的操作系统环境,比如是否在Windows系统下,文件路径是否有特殊字符,或者文件名是否正确。有时,文件名中的空格或特殊字符也可能导致问题,但根据错误信息,更可能的问题还是文件头格式不正确。 总结可能的解决方案步骤: 1. 检查宏文件的开头是否有正确的文件头,如“#!MC 1410”。 2. 确保文件扩展名为.mcr。 3. 使用合适的文本编辑器,避免添加非法字符。 4. 检查是否有语法错误,如拼写错误或格式问题。 5. 验证宏命令的正确性,特别是用户提供的示例宏是否有误。 同时,需要给出具体的示例,展示正确的宏文件格式,比如以版本声明开头,然后才是具体的命令。还要提醒用户如何正确保存和运行宏,例如在Tecplot中使用“宏 > 加载宏”功能,而不是直接双击文件。 可能用户之前尝试了提供的抽稀宏代码,但在保存为宏文件时没有正确设置文件头,导致无法识别。这时候需要指出问题所在,并给出修改后的正确示例,帮助用户纠正错误。</think>以下是关于 **Tecplot 宏文件头错误 `Error: Invalid Macro file header`** 的详细解释及解决方案: --- ### **错误原因** 此错误表示 Tecplot 无法识别宏文件的**文件头格式**。可能原因包括: 1. **文件头缺失**:宏文件未以 `#!MC` 或 `#!MC 版本号` 开头。 2. **版本号不兼容**:指定了 Tecplot 不支持的版本号(如 `#!MC 9999`)。 3. **编码或格式错误**:文件保存时使用了非 UTF-8 编码,或包含非法字符(如中文标点或 BOM 头)。 --- ### **修复方法** #### 1. **添加标准文件头** ```plaintext #!MC 1410 # 推荐版本号(适用于 Tecplot 360 2021R2 及以上) # 注释行(可选) ``` - **必须**以 `#!MC` 开头,后接空格和版本号(如 `1410`)。 - 版本号对应 Tecplot 版本(可通过 `Help > About Tecplot 360` 查询)。 #### 2. **检查文件保存格式** - **扩展名**:必须为 `.mcr`(如 `script.mcr`)。 - **编码**:使用 **UTF-8 无 BOM**(推荐使用 Notepad++、VS Code 等编辑器保存)。 #### 3. **验证示例** ```mcr #!MC 1410 $!RedrawAll # 示例命令:重绘界面 ``` 将此代码保存为 `test.mcr`,在 Tecplot 中加载测试是否报错。 --- ### **常见错误案例** | **错误写法** | **修正后** | |--| | 无文件头(直接写命令) | `#!MC 1410` + 命令 | | `##!MC 1410`(多一个`#`) | `#!MC 1410` | | `#!MC1410`(缺少空格) | `#!MC 1410` | --- ### **操作步骤** 1. **创建宏文件** 用文本编辑器新建文件,**首行添加 `#!MC 1410`**。 2. **编写宏命令** 在文件头下方输入 Tecplot 宏代码(如抽稀、绘图命令)。 3. **保存文件** 命名为 `xxx.mcr`,编码选择 **UTF-8 无 BOM**。 4. **加载宏** 在 Tecplot 中点击 `宏 (Macro) > 加载宏 (Load Macro)`,选择文件运行。 --- ### **进阶排查** - **检查隐藏字符**: 使用十六进制编辑器(如 Hex Editor)查看文件开头是否包含 `EF BB BF`(BOM 头),若有需删除。 - **版本兼容性**: 若仍报错,尝试替换 `#!MC 1410` 为更早版本(如 `#!MC 1200`)。 - **命令行调试**: 在 Tecplot 控制台(`View > Console`)中直接输入宏命令,验证是否语法错误。 --- ### **示例修正后的抽稀宏文件** ```mcr #!MC 1410 # 对三维区域 "fluid" 进行五倍抽稀,生成新区域并重命名为 "fluid2" $!EXTRACTSUBSET EXTRACTUSING = SUBSAMPLE SKIPX = 5 SKIPY = 5 SKIPZ = 5 ZONELIST = 'fluid' EXTRACTTO = NEWZONE $!RENAMEZONE ZONE = LASTADDEDZONE NAME = 'fluid2' ``` --- ### **总结** - **核心原则**:文件首行必须是 `#!MC 版本号`。 - **编码与扩展名**:确保 `.mcr` + UTF-8 无 BOM。 - 若需进一步帮助,请提供: 1. 完整的宏文件内容 2. Tecplot 版本号 3. 文件保存时使用的编辑器名称
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值