Objective-C:"Hello world"编译完成!没有Foundation标题.为什么?

Dad*_*dyM 1 c compilation objective-c

请考虑以下代码:

//#import <Foundation/Foundation.h>

int main(int argc, const char *argv[]) {
    @autoreleasepool {
        NSLog(@"Hello World!");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么它可以建立和运行?w/out基金会标题!

对我来说,C编译器编译这个代码w/out标题即w/out DECLARATIONS仍然很奇怪.奇怪的是,编译器以某种方式将我的函数与已编译的代码(Foundation)匹配并成功.是否有一些指向C标准的链接,它将解释我如何解析被识别为函数且以前从未声明过的令牌?

请解释!!

更新:这些不是由于预编译的标头

谢谢!但不是.我通过以下方式测试它 - 只需在vi编辑器中键入Hello World代码并将其保存为main.m文件.比用Terminal的clang编译它.电子邮件只有1个警告就可以了:

main.m:8:9: warning: implicitly declaring library function 'NSLog' with type 'void (id, ...)' NSLog(@"Hello World!");
^ main.m:8:9: note: please include the header <Foundation/NSObjCRuntime.h> or explicitly provide a declaration for 'NSLog'
1 warning generated.
Run Code Online (Sandbox Code Playgroud)

更新:只需逐步附加所有图像: 目录main.m中唯一的文件 main.m的内容 -  VIM 编译......编译! 构建应用程序的测试运行

Car*_*rum 7

它没有理由不编译.正如您所看到的,如果没有该标头,编译器假设NSLog是一个带签名的函数void NSLog(id, ...).在这种情况下,你甚至更幸运,因为该签名恰好与真正的函数声明兼容 - 这意味着你的程序实际上甚至可以正常工作:

FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
Run Code Online (Sandbox Code Playgroud)

请注意,如果没有链接到Foundation,构建将不会成功:

$ make example
cc     example.m   -o example
example.m:3:9: warning: implicitly declaring library function 'NSLog' with type
      'void (id, ...)'
        NSLog(@"Hello World!");
        ^
example.m:3:9: note: please include the header <Foundation/NSObjCRuntime.h> or
      explicitly provide a declaration for 'NSLog'
1 warning generated.
Undefined symbols for architecture x86_64:
  "_NSLog", referenced from:
      _main in example-943cd4.o
  "___CFConstantStringClassReference", referenced from:
      CFString in example-943cd4.o
  "_objc_autoreleasePoolPop", referenced from:
      _main in example-943cd4.o
  "_objc_autoreleasePoolPush", referenced from:
      _main in example-943cd4.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [example] Error 1
Run Code Online (Sandbox Code Playgroud)

你需要添加-framework Foundation:

$ CFLAGS="-framework Foundation" make example
cc -framework Foundation    example.m   -o example
example.m:3:9: warning: implicitly declaring library function 'NSLog' with type
      'void (id, ...)'
        NSLog(@"Hello World!");
        ^
example.m:3:9: note: please include the header <Foundation/NSObjCRuntime.h> or
      explicitly provide a declaration for 'NSLog'
1 warning generated.
Run Code Online (Sandbox Code Playgroud)