MSVC 2015运行C代码无输出,是否需修改C标准?如何解决?
C代码在MSVC 2015无输出的原因及解决办法
测试代码
#include <stdio.h> typedef char charray5[5]; charray5 carr1 = { 'a', 'b', 'c', 'd', '\0' }; charray5 carr2 = { 'q', 'w', 'e', 'r', '\0' }; charray5 carr3 = { 'x', 'y', 'z', 'w', '\0' }; charray5* func1() { return &carr1; } charray5* func2() { return &carr2; } charray5* func3() { return &carr3; } char (*(*x[3])())[5] = { func1, func2, func3 }; int main() { printf("func1 = [%c, %c, %c, %c]\n", ((*(x[0]))())[0][0], ((*(x[0]))())[0][1], ((*(x[0]))())[0][2], ((*(x[0]))())[0][3]); printf("func2 = [%c, %c, %c, %c]\n", ((*(x[1]))())[0][0], ((*(x[1]))())[0][1], ((*(x[1]))())[0][2], ((*(x[1]))())[0][3]); printf("func3 = [%c, %c, %c, %c]\n", ((*(x[2]))())[0][0], ((*(x[2]))())[0][1], ((*(x[2]))())[0][2], ((*(x[2]))())[0][3]); return 0; }
预期输出(Code::Blocks中正常运行)
func1 = [a, b, c, d]
func2 = [q, w, e, r]
func3 = [x, y, z, w]
问题现象
使用MSVC 2015编译运行后无任何输出,无警告和错误,仅显示‘按任意键继续...’。猜测是否因为MSVC 2015采用C99标准,而代码适配C11或C17标准?
解答
猜测正确性判断
你的猜测不完全正确。MSVC 2015对C标准的支持确实不完善,仅部分实现了C99,未完全支持C11/C17,但这段代码的问题和C版本标准关联不大,核心是MSVC对函数指针的类型匹配检查更严格,且在typedef的类型推导上存在行为差异,导致代码出现未定义行为,最终无输出。MSVC 2015中获取正常输出的解决方法
方法一:强制类型转换函数指针
修改函数指针数组的初始化代码,给每个函数指针添加显式类型转换,让MSVC接受类型匹配:
char (*(*x[3])())[5] = { (char (*(*))())func1, (char (*(*))())func2, (char (*(*))())func3 };
方法二:简化指针访问逻辑
避免嵌套的函数指针调用,先将函数返回的指针存储到临时变量中再访问,代码更清晰且避开类型匹配问题:
int main() { char (*p1)[5] = func1(); printf("func1 = [%c, %c, %c, %c]\n", p1[0][0], p1[0][1], p1[0][2], p1[0][3]); char (*p2)[5] = func2(); printf("func2 = [%c, %c, %c, %c]\n", p2[0][0], p2[0][1], p2[0][2], p2[0][3]); char (*p3)[5] = func3(); printf("func3 = [%c, %c, %c, %c]\n", p3[0][0], p3[0][1], p3[0][2], p3[0][3]); return 0; }
方法三:明确typedef函数指针类型
先typedef出函数指针的类型,再用该类型定义数组,消除类型歧义:
#include <stdio.h> typedef char charray5[5]; typedef charray5* (*FuncPtr)(); // 定义返回charray5*的函数指针类型 charray5 carr1 = { 'a', 'b', 'c', 'd', '\0' }; charray5 carr2 = { 'q', 'w', 'e', 'r', '\0' }; charray5 carr3 = { 'x', 'y', 'z', 'w', '\0' }; charray5* func1() { return &carr1; } charray5* func2() { return &carr2; } charray5* func3() { return &carr3; } FuncPtr x[3] = { func1, func2, func3 }; // 使用明确的函数指针类型定义数组 int main() { char (*p)[5] = x[0](); printf("func1 = [%c, %c, %c, %c]\n", p[0][0], p[0][1], p[0][2], p[0][3]); p = x[1](); printf("func2 = [%c, %c, %c, %c]\n", p[0][0], p[0][1], p[0][2], p[0][3]); p = x[2](); printf("func3 = [%c, %c, %c, %c]\n", p[0][0], p[0][1], p[0][2], p[0][3]); return 0; }
内容的提问来源于stack exchange,提问作者The mayor of kazeroun
相关产品推荐
相关产品推荐

