【问题标题】:Defining a variable in a header file doesn't give an error在头文件中定义变量不会出错
【发布时间】:2023-03-12 15:05:01
【问题描述】:

我正在编写一些代码来测试不应在头文件中定义的变量。但是,没有任何错误。我就是想不通。

请告诉我为什么在运行build.bat 时没有发生错误。变量定义在头文件中,包含在两个源文件中。

CMake项目的结构是:

--build  
--include  
----module1.h  
--script  
----build.bat  
--src  
----Main.cpp  
----module1.cpp  
----CMakeLists.txt  
--CMakeLists.txt  

include/module1.h的内容是:

int a = 1;

src/module1.cpp的内容是:

#include "module1.h"

src/Main.cpp的内容是:

#include "module1.h"

根目录下CMakeLists.txt的内容为:

cmake_minimum_required(VERSION 3.0)

PROJECT(ProjectExample VERSION 0.1.0)

SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_FLAGS "-Wno-deprecated-declarations")

ENABLE_TESTING()
ADD_SUBDIRECTORY(src)

src/CMakeLists.txt的内容是:

SET(INCLUDE ${CMAKE_SOURCE_DIR}/include)

FILE(GLOB SOURCE "*.cpp")
LIST(REMOVE_ITEM SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/Main.cpp)

ADD_COMPILE_OPTIONS("-g")
ADD_COMPILE_OPTIONS("-Wall")
ADD_LIBRARY(hello ${SOURCE})

TARGET_INCLUDE_DIRECTORIES(hello PUBLIC "${INCLUDE}")
ADD_EXECUTABLE(main ${CMAKE_CURRENT_SOURCE_DIR}/Main.cpp)
TARGET_LINK_LIBRARIES(main hello)

script/build.bat的内容是:

@echo off
pushd .

if not exist build (
     md build
)

cd build
cmake -G"MinGW Makefiles" ..
mingw32-make.exe

popd

【问题讨论】:

  • 未使用的变量。
  • 好吧,你没有说错误是什么,但很明显,如果你在头文件中定义一个变量,那么你将面临多个定义错误的风险。答案是在头文件中声明(不定义)变量。你知道区别吗?
  • 对不起,我的意思是它应该有多重定义的错误,但它没有。我就是想不通。
  • @fizzbuzz 对不起,我看错了你的问题。 SM 可能是对的
  • @S.M.正如你所说,我在 module1.cpp 中添加了函数 PrintA()。在 Main.cpp 的函数 main() 中,调用了 PrintA()。然后出现错误“a”的多重定义。是不是只有在这种情况下,才会发生外部联动?

标签: c++ variables cmake definition


【解决方案1】:

首先,忘记头文件。那是一种分心。本质上,问题在于有两个定义相同名称的源文件:

// file1.cpp
int a = 1;

// file2.cpp
int a = 1;

问题是,为什么编译和链接这段代码没有报错?

技术上的答案是,这样的重新定义违反了单一定义规则 (ODR),并且违反 ODR 不需要诊断。

实际上,函数的重复定义会给出错误消息。 数据的重复定义有时不会。

如果你幸运的话,当你运行代码时,它会发生灾难性的失败。如果你不走运,它会在你的整个测试过程中正常工作,但在你向最重要的客户提供演示时会崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多