_tmain()主函数了解

_tmain是为支持Unicode而使用的main函数的别名。在预编译过程中,通过宏定义将其转换为主函数main。这种做法常见于使用了<tchar.h>头文件的C/C++项目中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个_tmain()是为了支持unicode所使用的main一个别名而已,既然是别名,应该有宏定义过的,在哪里定义的呢?就在那个让你困惑的<stdafx.h>里,有这么两行

#include <stdio.h>
#include < tchar.h>

我们可以在头文件< tchar.h>里找到_tmain的宏定义     

#define _tmain      main

所以,经过预编译以后, _tmain就变成main了
// TestMultiThreadClient.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #include <stdlib.h> #pragma comment(lib, "ws2_32.lib") #define SERVER_IP "127.0.0.1" #define PORT 8080 #define BUFFER_SIZE 1024 int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsaData; SOCKET clientSocket; struct sockaddr_in serverAddr; char buffer[BUFFER_SIZE]; int recvSize; // 初始化 Winsock if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup failed.\n"); return 1; } // 创建客户端套接字 clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (clientSocket == INVALID_SOCKET) { printf("Socket creation failed.\n"); WSACleanup(); return 1; } // 设置服务器地址 serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP); serverAddr.sin_port = htons(PORT); // 连接到服务器 if (connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { printf("Connection failed.\n"); closesocket(clientSocket); WSACleanup(); return 1; } printf("Connected to server.\n"); while (1) { // 输入消息 printf("Enter message: "); fgets(buffer, BUFFER_SIZE, stdin); buffer[strlen(buffer) - 1] = '\0'; // 去掉换行符 // 发送消息 send(clientSocket, buffer, strlen(buffer), 0); // 如果输入 "bye",退出循环 if (strcmp(buffer, "bye") == 0) { printf("Closing connection.\n"); break; } // 接收服务器回显 recvSize = recv(clientSocket, buffer, BUFFER_SIZE, 0); if (recvSize <= 0) { printf("Server disconnected or error occurred.\n"); break; } buffer[recvSize] = '\0'; // 确保字符串以 null 结尾 printf("Received from server: %s\n", buffer); } // 关闭客户端套接字 closesocket(clientSocket); WSACleanup(); return 0; }
最新发布
03-29
分析下面代码,检查在VS2022中是否有误 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <winsock2.h> #include <iphlpapi.h> #include <ws2tcpip.h> #pragma comment(lib, "ws2_32.lib") #pragma comment(lib, "iphlpapi.lib") // 功能一:解析域名的 IP 地址 void ResolveDomainNames(const char** domains, int count) { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { fprintf(stderr, "WSAStartup failed.\n"); return; } for (int i = 0; i < count; i++) { struct hostent* host = gethostbyname(domains[i]); if (host == NULL) { fprintf(stderr, "Failed to resolve %s: %d\n", domains[i], WSAGetLastError()); continue; } printf("IP addresses for %s:\n", domains[i]); for (int j = 0; host->h_addr_list[j] != NULL; j++) { struct in_addr addr; addr.s_addr = *(u_long*)host->h_addr_list[j]; printf("%s\n", inet_ntoa(addr)); } } WSACleanup(); } // 功能二:获取并输出本地主机的网络适配器信息 void PrintAdapterInfo() { PIP_ADAPTER_INFO pAdapterInfo; PIP_ADAPTER_INFO pAdapter = NULL; DWORD dwRetVal = 0; ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO); // 分配内存 pAdapterInfo = (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO)); if (pAdapterInfo == NULL) { fprintf(stderr, "Error allocating memory needed to call GetAdaptersInfo\n"); return; } // 如果缓冲区不够大,重新分配内存 if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) { free(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen); if (pAdapterInfo == NULL) { fprintf(stderr, "Error allocating memory needed to call GetAdaptersInfo\n"); return; } } // 获取适配器信息 if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) { pAdapter = pAdapterInfo; while (pAdapter) { printf("Adapter Name: %s\n", pAdapter->AdapterName); printf("IP Address: %s\n", pAdapter->IpAddressList.IpAddress.String); printf("Subnet Mask: %s\n", pAdapter->IpAddressList.IpMask.String); printf("Gateway: %s\n", pAdapter->GatewayList.IpAddress.String); printf("MAC Address: "); for (int i = 0; i < pAdapter->AddressLength; i++) { if (i == (pAdapter->AddressLength - 1)) printf("%.2X\n", (int)pAdapter->Address[i]); else printf("%.2X-", (int)pAdapter->Address[i]); } printf("\n"); pAdapter = pAdapter->Next; } } else { fprintf(stderr, "GetAdaptersInfo failed with error: %d\n", dwRetVal); } // 释放内存 if (pAdapterInfo) free(pAdapterInfo); } int _tmain(int argc, _TCHAR* argv[]) { // 功能一:解析多个域名的 IP 地址 const char* domains[] = { "www.163.com", "www.swust.edu.cn" }; int domainCount = sizeof(domains) / sizeof(domains[0]); printf("Resolving domain names...\n"); ResolveDomainNames(domains, domainCount); // 功能二:获取并输出本地主机的网络适配器信息 printf("\nPrinting local adapter information...\n"); PrintAdapterInfo(); return 0; }
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WX Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值