小编Pho*_*hao的帖子

Lua,关于__gc设置顺序的问题

谁能告诉我为什么 code1 和 code2 有不同的结果,而 code3 和 code4 有相同的结果。
代码1:

o = {x = "hi"}
mt = {}
mt.__gc = function (o) print(o.x) end
setmetatable(o, mt)
o = nil
collectgarbage()
Run Code Online (Sandbox Code Playgroud)

代码1的结果:

你好

代码2:

o = {x = "hi"}
mt = {}
setmetatable(o, mt)
mt.__gc = function (o) print(o.x) end
o = nil
collectgarbage()
Run Code Online (Sandbox Code Playgroud)

code2:nothing的结果
code1和code2唯一的区别就是语句setmetatable(o, mt)和语句mt.__gc = function (o) print(o.x) end的执行顺序不同。他们的结果完全不同:第一个打印 hi 而另一个什么都不打印。将元表设置为对象的顺序最终会影响结果吗?如果是,为什么 code3 和 code4 有相同的结果?
代码3

o = {x = "hi"}
mt = {} …
Run Code Online (Sandbox Code Playgroud)

lua

5
推荐指数
1
解决办法
56
查看次数

clang:警告:编译期间未使用参数:'-rdynamic'

-rdynamic我尝试在 CMakeLists.txt 文件中使用选项,如下所示:

cmake_minimum_required(VERSION 3.5)
project(Tmuduo CXX)
...
set(CMAKE_CXX_STANDARD 11)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    add_compile_options(-Wthread-safety )
endif()

add_compile_options(
 # -DVALGRIND
 -Wall
 -Wno-unused-parameter
 -Woverloaded-virtual
 -Wpointer-arith
 -Wwrite-strings
 -O3
 -rdynamic
 )
...
Run Code Online (Sandbox Code Playgroud)

当我使用cmake .. -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clangand时make VERBOSE=1,我收到一些消息如下: 在此输入图像描述

正如您所看到的,-rdynamic编译选项确实出现在 clang++ 命令中,并且编译器还抱怨该参数未使用。但是当我使用下面的命令时,奇怪的事情发生了。

cmake_minimum_required(VERSION 3.5)
project(Tmuduo CXX)
...
set(CMAKE_CXX_STANDARD 11)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    add_compile_options(-Wthread-safety )
endif()

add_compile_options(
 # -DVALGRIND
 -Wall
 -Wno-unused-parameter
 -Woverloaded-virtual
 -Wpointer-arith
 -Wwrite-strings
 -O3
 -rdynamic
 )
...
Run Code Online (Sandbox Code Playgroud)

一切顺利。这次,这个-rdynamic选项起作用了。这确实让我很困惑。谁能告诉我这是怎么回事?为什么 clang++ …

c++ cmake clang compiler-warnings

1
推荐指数
1
解决办法
4170
查看次数

标签 统计

c++ ×1

clang ×1

cmake ×1

compiler-warnings ×1

lua ×1