小编use*_*609的帖子

类似函数的宏扩展为空

这是一个很奇怪的问题。这是一个非常简单的类似函数的宏,我已经多次看到它的例子。我什至以前用过它!但是,我在 6 小时后无法正常工作。我累了,决定在这里问。也许有人发现了问题。最小的可重现情况是:

enum e {
    x, y, z,

#define Func(X, Y, Z) \
  my_##X = Y

Func(x, y, z),
};
Run Code Online (Sandbox Code Playgroud)

它以类似的方式用于 clang源代码。我也包含一个包含宏的定义和使用的文件。

编辑:

非常感谢您的回答和评论。我确实使用过 Godbolt,但是在我的构建失败之后。事实证明,宏在我的构建过程中从未失败过。那是因为我没用过宏!它没有被使用,所以它从来没有产生过输出。真是太丢人了。我必须接受我的错误,然后继续前进。我必须通过本地预处理来检查它。在 Godbolt 中得到空字符串让我相信我做错了什么。

c c++ c-preprocessor

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

CMake 目标取决于已安装的目标

我已经搜索过这个,但也许我使用了错误的措辞;我希望在安装另一个目标后构建一个 CMake 目标。

举一个具体的例子,我希望我的测试包含一个库版本并与之链接,其目录结构类似于实际安装。目录结构:

project
  lib
    first_library
      header1.hpp
      source1.cpp # this includes "first_library/header1.hpp"
    second_library
      header2.hpp
      source2.cpp # likewise, #include "second_library/header2.hpp"
  tests
    lib1_tests
      test1.cpp # this must include "first_library/header1.hpp"
    lib2_tests
      test2.cpp # likewise, #include "second_library/header2.hpp"
Run Code Online (Sandbox Code Playgroud)

这些都不适合我。在 lib 目录中的 CMakeLists.txt 中,我有:

add_library(lib1 STATIC ${lib1_SOURCES} ${lib1_HEADERS})
set_property(TARGET lib1 APPEND
    PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/../")
install(TARGETS lib1 EXPORT lib1
    ARCHIVE DESTINATION lib
    INCLUDES DESTINATION include)
install(FILES ${lib1_HEADERS}
    DESTINATION include/my_lib_collection/first_library)
Run Code Online (Sandbox Code Playgroud)

和测试有

add_executable(tests "${TEST_SOURCES}")
add_dependencies(tests lib1)
add_dependencies(tests lib2)
target_link_libraries(tests ${GTEST_BOTH_LIBRARIES}
    lib1 lib2)
target_include_directories(tests
    INTERFACE $<INSTALL_INTERFACE:INTERFACE_INCLUDE_DIRECTORIES:include/my_lib_collection>)
set_property(TARGET tests APPEND …
Run Code Online (Sandbox Code Playgroud)

cmake

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

预处理器:将字符串连接到__VA_ARGS__中的每个参数

我想为可变参数宏中的每个元素追加一个字符串化的宏参数.我想我知道我需要什么,但我还没有想出一个有效的解决方案.给出一个可变宏,如:

#define FIELD_DECLARATION(NAME, OTHER_FIELD, ...)

FIELD_DECLARATION(First, Thing)
FIELD_DECLARATION(Second, Thing, Thing, Nothing)
Run Code Online (Sandbox Code Playgroud)

我想生成:

field_First = {ThingArg};
field_Second = {ThingArg, ThingArg, NothingArg};
Run Code Online (Sandbox Code Playgroud)

我想我需要的是递归地继续扩展__VA_ARGS__直到它没有元素,并"Arg"在进行扩展时追加.最后,将结果传递给另一个可变参数宏,该宏生成以逗号分隔的参数列表.

我试过这个,这是行不通的(也不是我所描述的):

#define UNPACK_VA_1(A1) A1 ## Arg
#define UNPACK_VA_2(A1, A2) UNPACK_VA_1(A1), UNPACK_VA_1(A2)
#define UNPACK_VA_3(A1, A2, A3) UNPACK_VA_2(A1, A2), UNPACK_VA_1(A3)
#define UNPACK_VA_4(A1, A2, A3, A4) UNPACK_VA_2(A1, A2), UNPACK_VA_2(A3, A4)
#define UNPACK_VA(...) UNPACK_VA_4(__VA_ARGS__)

#define FOO(x, y, ...) UNPACK_VA(__VA_ARGS__)
FOO(One, Two, Three, Four, Five, Six)
Run Code Online (Sandbox Code Playgroud)

虽然这有点奏效,但我无法提出可扩展的解决方案.如果有人可以放光,那就太棒了.

c macros c-preprocessor

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

标签 统计

c ×2

c-preprocessor ×2

c++ ×1

cmake ×1

macros ×1