更新到 Xcode9 后,我得到C++需要所有声明的类型说明符
After update to Xcode9, I'm getting C++ requires a type specifier for all declarations
我有一个在目标C中编码的项目,该项目使用simple.h。
代码运行完美,直到我将Xcode更新为v9.0;它不再编译文件简单中的错误。
c 需要所有声明的类型说明
simple.h
上的每条线上都会生成错误check_compile_time(sizeof(IPHeader) == 20);
check_compile_time(offsetof(IPHeader, versionAndHeaderLength) == 0);
check_compile_time(offsetof(IPHeader, differentiatedServices) == 1);
check_compile_time(offsetof(IPHeader, totalLength) == 2);
check_compile_time(offsetof(IPHeader, identification) == 4);
check_compile_time(offsetof(IPHeader, flagsAndFragmentOffset) == 6);
check_compile_time(offsetof(IPHeader, timeToLive) == 8);
check_compile_time(offsetof(IPHeader, protocol) == 9);
check_compile_time(offsetof(IPHeader, headerChecksum) == 10);
check_compile_time(offsetof(IPHeader, sourceAddress) == 12);
check_compile_time(offsetof(IPHeader, destinationAddress) == 16);
班级简单。h包括以下类
#include <AssertMacros.h> // for __Check_Compile_Time
check_compile_time的代码定义如下:
#ifndef __Check_Compile_Time
#ifdef __GNUC__
#define __Check_Compile_Time( expr )
extern int compile_time_assert_failed[ ( expr ) ? 1 : -1 ] __attribute__( ( unused ) )
#else
#define __Check_Compile_Time( expr )
extern int compile_time_assert_failed[ ( expr ) ? 1 : -1 ]
#endif
#endif
第一个问题:如何解决这个问题?第二个问题:我似乎无法修改assertmacros.h文件,它被锁定了..我应该解锁并修复它吗?还是我还能做其他事情来解决问题?
多亏了讲故事的评论,我刚刚注意到,苹果将__check_compile_time的名称修改为__check_compile_time s sastertmacros.h要解决问题,请使用__check_compile_time
更新Check_compile_time的所有实例因此,Apple Simpleping的更新代码应为以下内容:
#import <Foundation/Foundation.h>
#if TARGET_OS_EMBEDDED || TARGET_IPHONE_SIMULATOR
#import <CFNetwork/CFNetwork.h>
#else
#import <CoreServices/CoreServices.h>
#endif
#include <AssertMacros.h>
#pragma mark * SimplePing
// The SimplePing class is a very simple class that lets you send and receive pings.
@protocol SimplePingDelegate;
@interface SimplePing : NSObject
{
NSString * _hostName;
NSData * _hostAddress;
CFHostRef _host;
CFSocketRef _socket;
id<SimplePingDelegate> _delegate;
uint16_t _identifier; // host byte order
uint16_t _nextSequenceNumber; // host byte order
}
+ (SimplePing *)simplePingWithHostName:(NSString *)hostName; // chooses first IPv4 address
+ (SimplePing *)simplePingWithHostAddress:(NSData *)hostAddress; // contains (struct sockaddr)
@property (nonatomic, assign, readwrite) id<SimplePingDelegate> delegate;
@property (nonatomic, copy, readonly) NSString * hostName;
@property (nonatomic, copy, readonly) NSData * hostAddress;
@property (nonatomic, assign, readonly) uint16_t identifier;
@property (nonatomic, assign, readonly) uint16_t nextSequenceNumber;
- (void)start;
// Starts the pinger object pinging. You should call this after
// you've setup the delegate and any ping parameters.
- (void)sendPingWithData:(NSData *)data;
// Sends an actual ping. Pass nil for data to use a standard 56 byte payload (resulting in a
// standard 64 byte ping). Otherwise pass a non-nil value and it will be appended to the
// ICMP header.
//
// Do not try to send a ping before you receive the -simplePing:didStartWithAddress: delegate
// callback.
- (void)stop;
// Stops the pinger object. You should call this when you're done
// pinging.
+ (const struct ICMPHeader *)icmpInPacket:(NSData *)packet;
// Given a valid IP packet contains an ICMP , returns the address of the ICMP header that
// follows the IP header. This doesn't do any significant validation of the packet.
@end
@protocol SimplePingDelegate <NSObject>
@optional
- (void)simplePing:(SimplePing *)pinger didStartWithAddress:(NSData *)address;
// Called after the SimplePing has successfully started up. After this callback, you
// can start sending pings via -sendPingWithData:
- (void)simplePing:(SimplePing *)pinger didFailWithError:(NSError *)error;
// If this is called, the SimplePing object has failed. By the time this callback is
// called, the object has stopped (that is, you don't need to call -stop yourself).
// IMPORTANT: On the send side the packet does not include an IP header.
// On the receive side, it does. In that case, use +[SimplePing icmpInPacket:]
// to find the ICMP header within the packet.
- (void)simplePing:(SimplePing *)pinger didSendPacket:(NSData *)packet;
// Called whenever the SimplePing object has successfully sent a ping packet.
- (void)simplePing:(SimplePing *)pinger didFailToSendPacket:(NSData *)packet error:(NSError *)error;
// Called whenever the SimplePing object tries and fails to send a ping packet.
- (void)simplePing:(SimplePing *)pinger didReceivePingResponsePacket:(NSData *)packet;
// Called whenever the SimplePing object receives an ICMP packet that looks like
// a response to one of our pings (that is, has a valid ICMP checksum, has
// an identifier that matches our identifier, and has a sequence number in
// the range of sequence numbers that we've sent out).
- (void)simplePing:(SimplePing *)pinger didReceiveUnexpectedPacket:(NSData *)packet;
// Called whenever the SimplePing object receives an ICMP packet that does not
// look like a response to one of our pings.
@end
#pragma mark * IP and ICMP On-The-Wire Format
// The following declarations specify the structure of ping packets on the wire.
// IP header structure:
struct IPHeader {
uint8_t versionAndHeaderLength;
uint8_t differentiatedServices;
uint16_t totalLength;
uint16_t identification;
uint16_t flagsAndFragmentOffset;
uint8_t timeToLive;
uint8_t protocol;
uint16_t headerChecksum;
uint8_t sourceAddress[4];
uint8_t destinationAddress[4];
// options...
// data...
};
typedef struct IPHeader IPHeader;
__Check_Compile_Time(sizeof(IPHeader) == 20);
__Check_Compile_Time(offsetof(IPHeader, versionAndHeaderLength) == 0);
__Check_Compile_Time(offsetof(IPHeader, differentiatedServices) == 1);
__Check_Compile_Time(offsetof(IPHeader, totalLength) == 2);
__Check_Compile_Time(offsetof(IPHeader, identification) == 4);
__Check_Compile_Time(offsetof(IPHeader, flagsAndFragmentOffset) == 6);
__Check_Compile_Time(offsetof(IPHeader, timeToLive) == 8);
__Check_Compile_Time(offsetof(IPHeader, protocol) == 9);
__Check_Compile_Time(offsetof(IPHeader, headerChecksum) == 10);
__Check_Compile_Time(offsetof(IPHeader, sourceAddress) == 12);
__Check_Compile_Time(offsetof(IPHeader, destinationAddress) == 16);
// ICMP type and code combinations:
enum {
kICMPTypeEchoReply = 0, // code is always 0
kICMPTypeEchoRequest = 8 // code is always 0
};
// ICMP header structure:
struct ICMPHeader {
uint8_t type;
uint8_t code;
uint16_t checksum;
uint16_t identifier;
uint16_t sequenceNumber;
// data...
};
typedef struct ICMPHeader ICMPHeader;
__Check_Compile_Time(sizeof(ICMPHeader) == 8);
__Check_Compile_Time(offsetof(ICMPHeader, type) == 0);
__Check_Compile_Time(offsetof(ICMPHeader, code) == 1);
__Check_Compile_Time(offsetof(ICMPHeader, checksum) == 2);
__Check_Compile_Time(offsetof(ICMPHeader, identifier) == 4);
__Check_Compile_Time(offsetof(ICMPHeader, sequenceNumber) == 6);
相关文章:
- std::enable_if 更改成员 *变量* 声明/类型
- 对前向声明类型进行unique_ptr的解决方法
- 如何将声明类型作为参数发送
- 在 Fortran 中泛化特定声明类型的操作
- 使用 (c++11) 声明类型时放置 __declspec(dllimport) 关键字的位置
- 模板函数可以使用带有删除的构造函数的声明类型
- 声明类型没有任何可变类型
- 如何使用声明类型简化此代码
- 使用声明类型选择函数专业化
- 替代班级内声明类型的别名
- 对于自动键入推论的参数,声明类型(自动)应推导的内容
- 使用 decltype 的条件声明类型
- 您如何声明类型结构的堆栈?在C 中
- 将指向前向声明类型的指针推送到 typedef'd 向量时出现编译器错误
- 声明适用于 auto,但不能显式声明类型?
- 声明类型包含未展开的参数包'Args'
- 课堂上的Typedef.在另一个类错误中:尚未声明类型
- 冲突的声明类型/价值不匹配
- 获取具有AST访问者clang的功能声明类型
- 变量声明类型定义 C 中的约定